在OCaml中为模块编写单元测试的正确方法
问题描述:
我在module.mli
文件中给出了给定的接口规范。我必须在module.ml
文件中编写它的实现。在OCaml中为模块编写单元测试的正确方法
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