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

时间:2015-11-04 14:22:14

标签: unit-testing ocaml ounit

我在module.mli文件中有一个给定的接口规范。我必须在module.ml文件中编写它的实现。

module.mli提供了抽象类型

type abstract_type

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

但是可以在不修改界面的情况下做这样的事情吗?

1 个答案:

答案 0 :(得分:4)

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

let some_test = ...

let () = Tests.register some_test

我不推荐这种方法,因为Tests模块无法控制它将要运行的测试。

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

请注意,不依赖于OUnit,您可以导出任何人都可以运行的以下类型的测试。我们的测试看起来像这样:

let test_cool_feature () =
  ...
  assert ...;
  ...
  assert ...;
  true

let test_super_feature () =
  ...
  a = b

let tests = [
  "cool feature", test_cool_feature;
  "super feature", test_super_feature;
]

界面是:

...
(**/**)
(* begin section ignored by ocamldoc *)

val test_cool_feature : unit -> bool
val test_super_feature : unit -> bool
val tests : (string * (unit -> bool)) list