跨越不同版本的OCaml的可重复性和随机模块

时间:2012-01-31 19:14:33

标签: testing random ocaml

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

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

我想将Random模块从3.12.1替换到我们的发行版中,以保证一致性,无论用户编译的OCaml版本如何。但是,在源目录中删除Random模块的天真方法报告编译器找到了两个定义名为Random的模块的文件。

有关解决此问题的任何建议吗?我意识到我可以将Random重命名为XRandom,然后使用该模块来定义我需要的内容或包含标准库随机模块,但这需要更改每个函数调用并允许开发人员继续(意外地) )使用Random而不是重载版本。有没有办法在编译期间选择特定的随机模块?或者也许是其他一些我不知道的选择。

编辑

我刚刚从OCaml 3.12.1中取出随机模块并将其放入我的项目中,在通过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, - no-as-needed -cc gcc -cclib -llapack -cclib -lblas -cclib -lgfortran -cclib -lz -cclib -lreadline -cclib -lm -cclib''compileFlags.cmx all_sets.cmx < strong> random.cmx status.cmx timer.cmx sexpr.cmx xml.cmx bitSet.cmx lz.cmx fileStream.cmx methods.cmx utl.cmx cost_matrix.cmx alphabet.cmx primes.cmx fileContents.cmx numeric。 cmx version.cmx scripting.cmx libgrappa.a libgzcaml.a libzlibstubs.a libcs​​ide.a -o scripting.native

1 个答案:

答案 0 :(得分:2)

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

不幸的是,我担心你的问题没有好的和干净的解决方案......