2015-11-04 2 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 
Смежные вопросы