OCaml поддерживает статическое связывание и динамическую загрузку модулей; что вы обычно делаете (и что является типобезопасным) - это статическое связывание. Я бы рекомендовал только динамическую загрузку, если вам нужна какая-то архитектура плагинов.
В любом случае, библиотека - это не что иное, как модуль (возможно, с подмодулями).
Если вы статически связываете модуль, все «основные» подпрограммы будут выполняться в том порядке, в котором модули связаны в вашем исполняемом файле.
Так что, если вы ничего не делаете с этим, модуль не знает, с каким исполняемым файлом он каким-то «волшебным» образом связан; то, что вы должны сделать, imho:
- перенести тесты из модулей, возможно, используя ounit ИЛИ
- как минимум переписать ваши тестовые функции, чтобы они стали реальными функциями, например "let test () = ..."; затем напишите интерфейс тестирования, который будет вызывать все «тестовые» функции из всех ваших модулей.
дополнение:
Если вы сделаете это на других языках, то, кажется, бесплатного торта тоже не будет:
В Java, если у вас в коде несколько сетей, вы должны явно выбрать ту, которую вы хотите, чтобы исполняемый файл выполнялся.
В C вы можете использовать препроцессор C, чтобы сделать что-то вроде
#ifdef TEST_1
int main() {
...
}
#endif
OCaml имеет свой собственный препроцессор camlp4 ( camlp4 wikipedia article ), с которым вы можете сделать что-то подобное.
Я лично считаю этот вид встраивания тестов плохой разработкой программного обеспечения. Вам лучше протестировать свой модуль / класс / .. со стороны интерфейса и пометить свои внутренние инварианты утверждениями (которые существуют в Java, C & OCaml).