Правильный способ написания модульных тестов для модуля в OCaml
У меня есть заданная спецификация интерфейса в module.mli
файл. Я должен написать его реализацию в module.ml
файл.
module.mli
обеспечивает абстрактный тип
type abstract_type
Я использую OUnit для создания тестов. Мне нужно использовать реализацию типа в них. (например, для сравнения значений) Одним из решений будет расширение интерфейса для включения дополнительных функций, используемых в тестах.
Но возможно ли это сделать без изменения интерфейса?
1 ответ
Единственный способ выставить тесты, не касаясь интерфейса модуля, - это зарегистрировать тесты в каком-то глобальном контейнере. Если у вас есть модуль под названием Tests
это обеспечивает функцию register
, ваш module.ml
будет содержать что-то вроде этого:
let some_test =... let () = Tests.register some_test
Я не рекомендую этот подход, потому что Tests
модуль теряет контроль над тем, какие тесты он собирается запускать.
Вместо этого я рекомендую экспортировать тесты, то есть добавлять их в module.mli
,
Обратите внимание, что независимо от OUnit, вы можете экспортировать тесты следующего типа, которые может запустить любой. Наши тесты выглядят так:
let test_cool_feature () =... утверждать...; ... утверждать...; правда let test_super_feature () = ... а = б давай тесты = [ "классная функция", test_cool_feature; "супер функция", test_super_feature; ]
Интерфейс:
... (** / **) (* начало раздела игнорируется ocamldoc *) val test_cool_feature: unit -> bool val test_super_feature: unit -> bool val tests: (string * (unit -> bool)) список