Получение результатов теста от Eunit в Эрланге
Я работаю с Erlang и EUnit над проведением модульных тестов, и я хотел бы написать тестовый прогон для автоматизации выполнения моих модульных тестов. Проблема в том, что eunit:test/1, похоже, возвращает только "error" или "ok", а не список тестов и того, что они вернули в терминах того, что прошло или не удалось.
Так есть ли способ запустить тесты и получить некоторую форму структуры данных о том, какие тесты выполнялись, и о состоянии их прохождения / неудачи?
3 ответа
Если вы используете арматуру, вам не нужно реализовывать свой собственный бегун. Вы можете просто запустить:
rebar eunit
Арматура скомпилирует и запустит все тесты в test
каталог (а также тесты eunit внутри ваших модулей). Кроме того, арматура позволяет установить те же параметры в rebar.config
как в оболочке:
{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
Вы можете использовать эти параметры также в оболочке:
> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).
См. Также документацию для подробного варианта и структурированного отчета.
Альтернативным вариантом будет использование Common Test вместо Eunit. Общий тест идет с бегуном (ct_run
команда) и дает вам больше гибкости в настройке теста, но также немного сложнее в использовании. Common Test не хватает доступных макросов, но создает очень понятные HTML-отчеты.
Нет простого или документированного способа, но в настоящее время есть два способа сделать это. Одним из них является предоставление опции 'event_log' при запуске тестов:
eunit:test(my_module, [event_log])
(это недокументировано и действительно предназначалось только для отладки). Результирующий файл "eunit-events.log" представляет собой текстовый файл, который Erlang может прочитать с помощью file:consult(Filename).
Более мощный способ (и на самом деле не такой уж и сложный) - реализовать пользовательский прослушиватель событий и предоставить его в качестве опции для eunit:
eunit:test(my_module, [{report, my_listener_module}])
Это пока не задокументировано, но так и должно быть. Модуль слушателя реализует поведение eunit_listener (см. Src/eunit_listener.erl). Есть только пять функций обратного вызова для реализации. Посмотрите src/eunit_tty.erl и src/eunit_surefire.erl для примеров.
Я только что отправил на GitHub очень тривиальный слушатель, который сохраняет результаты EUnit в таблице DETS. Это может быть полезно, если вам потребуется дополнительная обработка этих данных, поскольку они хранятся в виде терминов Эрланга в таблице DETS.
https://github.com/prof3ta/eunit_terms
Пример использования:
> eunit:test([fact_test], [{report,{eunit_terms,[]}}]).
All 3 tests passed.
ok
> {ok, Ref} = dets:open_file(results).
{ok,#Ref<0.0.0.114>}
> dets:lookup(Ref, testsuite).
[{testsuite,<<"module 'fact_test'">>,8,<<>>,3,0,0,0,
[{testcase,{fact_test,fact_zero_test,0,0},[],ok,0,<<>>},
{testcase,{fact_test,fact_neg_test,0,0},[],ok,0,<<>>},
{testcase,{fact_test,fact_pos_test,0,0},[],ok,0,<<>>}]}]
Надеюсь это поможет.