2015-11-04 56 views
2

我在module.mli文件中给出了给定的接口规范。我必须在module.ml文件中编写它的实现。在OCaml中为模块编写单元测试的正确方法

module.mli提供了一个抽象类型

type abstract_type 

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

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

回答

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 
相关问题