我一直在建立一个测试套件,同时推进我的团队正在编写的应用程序,今天我遇到了一个问题,即如何测试通过我们的应用程序运行的脚本。我们允许用户为Random模块设置种子,以允许结果可重复(这在科学应用中非常重要),我在测试套件中使用它来比较一组脚本中的stdout / stderr与“已批准”运行。

在更新这些脚本时,我注意到所有脚本在某些计算机上均失败。我很快发现这是由于Random module from version 3.12.0更改了用于生成随机位的核心功能。当前,我们在多种环境(win32,osx,linux)上运行许多版本的OCaml(包括3.13),并且我们希望针对不同版本的OCaml进行测试。

我想将3.12.1中的Random模块替换到我们的发行版中,以实现一致性,而不考虑用户要编译的OCaml版本。但是,将Random模块放在源目录中的简单方法报告编译器找到了两个文件,这些文件定义了名为Random的模块。

对解决这个问题有什么建议吗?我意识到我可以将Random重命名为XRandom,然后使用该模块定义我需要的内容或包括标准库随机模块,但这将需要更改每个函数调用,并允许开发人员继续(偶然地)使用而不是重载版本。有没有一种方法可以在编译过程中选择特定的随机模块?也许我不知道其他选择。

编辑:

我只是从OCaml 3.12.1中获取了Random模块,并将其放入我的项目中,通过OCamlbuild进行编译时,在链接过程中收到了以下错误消息(与OCaml 3.13.0 + dev8相同的错误,几乎是我期望的我做的),

Error: Files random.cmx and /opt/ocaml-3.12.1/lib/ocaml/stdlib.cmxa
       both define a module named Random


链接线是


/opt/ocaml-3.12.1/bin/ocamlopt.opt dynlink.cmxa unix.cmxa str.cmxa bigarray.cmxa -I + camlp4 camlp4fulllib.cmxa -cclib -lcside -cclib -L。 -ccopt -I -ccopt / usr / lib -cclib -L。 -cclib -Wl,-不需要-cc gcc -cclib -llapack -cclib -lblas -cclib -lgfortran -cclib -lz -cclib -lreadline -cclib -lm -cclib''compileFlags.cmx all_sets.cmx随机.cmx状态.cmx计时器.cmx sexpr.cmx xml.cmx bitSet.cmx lz.cmx fileStream.cmx方法.cmx utl.cmx cost_matrix.cmx字母.cmx素数.cmx fileContents.cmx数值.cmx版本.cmx scripting.cmx libgrappa.a libgzcaml.a libzlibstubs.a libcs​​ide.a -o scripting.native

最佳答案

您确实可以使用自己的XRandom模块,并在测试文件的顶部添加module Random = XRandom

不幸的是,恐怕您的问题没有好的,干净的解决方案...

关于testing - 跨OCaml版本的可重复性和随机模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9085469/

10-09 23:08