Правильный способ написания модульных тестов для модуля в 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)) список
Другие вопросы по тегам