Наиболее распространенный подход - это один тестовый модуль на модуль приложения. Если вы правильно называете свои модули, EUnit найдет и запустит все ваши тесты для вас, нет необходимости создавать глобальный модуль, который запускает тесты. Например, учитывая:
- SRC /
- тест /
- meck_tests.erl
- meck_mod_tests.erl
Если вы запустите eunit:test(meck)
, он обнаружит (если вы на вашем пути) модуль meck_tests
и запустите meck_tests:test()
. Функция test()
автоматически вставляется в модуль EUnit при включении eunit.hrl
.
Что касается соглашений об именах, я обычно получаю что-то вроде этого:
-module(my_tests).
-export([functiona_should_do_this/0]).
-export([functionb_should_do_that/0]).
-export([functionb_should_not_crash/0]).
% etc
Если вы хотите, чтобы хорошие имена появлялись в тестовых прогонах, используйте возможности генератора тестов EUnit:
all_my_test_() ->
[{"Should not break X", fun first_test/0},
{"Should perform Y", fun other_test/0}].
Любая функция, заканчивающаяся test_
, сообщает EUnit, что она должна возвращать список тестов (это называется генератором тестов). Список тестов может состоять только из списка забав, списка кортежей, где первый элемент представляет собой строковое описание теста, или более сложной настройки:
advanced_test_() ->
{foreach, fun setup/0, fun teardown/1,
[{"Assert X", fun test1/0}]}.
Это будет запускаться setup/0
перед каждым тестовым набором и teardown/1
после каждого тестового случая. Аргументом teardown/1
является возвращаемое значение из setup/0
. Вы можете называть эти функции как угодно.
Подробная документация по использованию EUnit доступна здесь .
Вот как выглядит мой тестовый модуль: https://github.com/eproxus/meck/blob/master/test/meck_tests.erl