在 OCaml 中为模块编写单元测试的正确方法
The correct way to write unit tests for a module in OCaml
我在 module.mli
文件中有一个给定的接口规范。我必须在 module.ml
文件中编写它的实现。
module.mli
提供抽象类型
type abstract_type
我正在使用 OUnit 创建测试。我需要在其中使用类型的实现。 (例如比较值)一种解决方案是扩展接口以包含测试中使用的其他功能。
但是不修改界面就可以做这样的事情吗?
在不接触模块接口的情况下公开测试的唯一方法是使用某个全局容器注册测试。如果你有一个名为 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
我在 module.mli
文件中有一个给定的接口规范。我必须在 module.ml
文件中编写它的实现。
module.mli
提供抽象类型
type abstract_type
我正在使用 OUnit 创建测试。我需要在其中使用类型的实现。 (例如比较值)一种解决方案是扩展接口以包含测试中使用的其他功能。
但是不修改界面就可以做这样的事情吗?
在不接触模块接口的情况下公开测试的唯一方法是使用某个全局容器注册测试。如果你有一个名为 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