2012-06-14 6 views
4

Я работаю с Erlang и EUnit, чтобы выполнять модульные тесты, и я хотел бы написать тест-бегун для автоматизации работы моих модульных тестов. Проблема в том, что eunit: test/1, кажется, возвращает «ошибку» или «нормально», а не список тестов и то, что они вернули с точки зрения того, что прошло или не удалось.Получение результатов тестирования от Eunit в Erlang

Итак, есть способ запуска тестов и возврата какой-либо формы структуры данных, какие тесты выполнялись, и состояние их прохода/отказа?

ответ

9

Если вы используете арматуру, вам не нужно реализовывать свой собственный бегун. Вы можете просто запустить:

rebar eunit 

Арматурный будет скомпилировать и запустить все тесты в директории test (а также eunit тесты внутри ваших модулей). Кроме того, арматурный позволяет установить те же параметры в rebar.config, как в оболочке:

{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}. 

Вы можете использовать эти параметры также в оболочке:

> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]). 

Смотрите также документацию для verbose option и structured report.

Альтернативным вариантом было бы использовать Common Test вместо Eunit. Common Test поставляется с бегуном (команда ct_run) и дает вам больше гибкости в вашей тестовой настройке, но также немного сложнее в использовании. Common Test не хватает доступных макросов, но создает очень понятные html-отчеты.

+0

Каким образом CT более сложна, чем eunit? – Sedrik

5

Нелегкий или документированный способ, но в настоящее время вы можете сделать это двумя способами. Одним из них является, чтобы дать возможность «event_log» при выполнении тестов:

eunit:test(my_module, [event_log]) 

(это без документов и действительно предназначен только для отладки). Полученный файл «eunit-events.log» представляет собой текстовый файл, который может быть прочитан Erlang с помощью файла: 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.

2

Я только что нажал на GitHub очень тривиальный слушатель, который сохраняет результаты EUnit в таблице DETS. Это может быть полезно, если вам нужно продолжить обработку этих данных, поскольку они хранятся в терминах Erlang в таблице 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,<<>>}]}] 

Надеется, что это помогает.

+0

Это отличная благодарность –

Смежные вопросы