在 OCaml 中为模块编写单元测试的正确方法

mar*_*trz 4 ocaml unit-testing ounit

我在文件中有给定的接口规范module.mli。我必须将其实现写入module.ml文件中。

module.mli提供一个抽象类型

type abstract_type
Run Code Online (Sandbox Code Playgroud)

我正在使用 OUnit 来创建测试。我需要在其中使用类型的实现。(例如比较值)一种解决方案是扩展接口以包含测试中使用的附加函数。

但是不修改接口就可以做到这样的事情吗?

Mar*_*bon 5

在不接触模块接口的情况下公开测试的唯一方法是将测试注册到某个全局容器。如果您有一个名为Tests提供 function 的模块register,您module.ml将包含如下内容:

让 some_test = ...

let () = Tests.register some_test

我不推荐这种方法,因为Tests模块失去了对其将要运行的测试的控制。

相反,我建议导出测试,即将它们添加到module.mli.

请注意,在不依赖 OUnit 的情况下,您可以导出任何人都可以运行的以下类型的测试。我们的测试如下所示:

让 test_cool_feature () =
  ...
  断言...;
  ...
  断言...;
  真的

让 test_super_feature () =
  ...
  a = b

让测试= [
  “很酷的功能”,test_cool_feature;
  “超级功能”,test_super_feature;
]

界面是:

...
(**/**)
(* 开始部分被 ocamldoc 忽略 *)

val test_cool_feature :单位 -> bool
val test_super_feature : 单位 -> bool
val 测试 : (string * (unit -> bool)) 列表