#erlang #eunit
#erlang #eunit
Вопрос:
Я пытаюсь проверить, используются ли все индексы, которые я определил в MongoDB, в моем приложении и нет ли дополнительных индексов. У меня есть утилита, которая делает это для одного Eunit
набора тестов. Однако некоторые из моих компонентов имеют более одного Eunit
набора тестов, и мне было интересно, есть ли способ запустить общий код перед вызовом любого из наборов тестов, а затем запустить общий код демонтажа после завершения всех наборов тестов. Я использую rebar
для вызова Eunit
.
Заранее спасибо.
Ответ №1:
Как объясняется в документации eunit для тестовых представлений, наборы тестов могут быть глубокими списками. Ниже приведен пример модуля, показывающий использование внешнего setup
устройства, тесты которого являются генераторами, каждый из которых снабжает внутреннее setup
устройство. Внутренние setup
приспособления соответствуют вашим существующим наборам тестов, каждый со своими собственными функциями настройки и очистки. Внешнее setup
устройство обеспечивает общую настройку и очистку для внутренних наборов.
-module(t).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").
top_setup() ->
?debugMsg("top setup").
top_cleanup(_) ->
?debugMsg("top cleanup").
test_t1() ->
{setup,
fun() -> ?debugMsg("t1 setup") end,
fun(_) -> ?debugMsg("t1 cleanup") end,
[fun() -> ?debugMsg("t1 test 1") end,
fun() -> ?debugMsg("t1 test 2") end,
fun() -> ?debugMsg("t1 test 3") end]}.
test_t2() ->
{setup,
fun() -> ?debugMsg("t2 setup") end,
fun(_) -> ?debugMsg("t2 cleanup") end,
[fun() -> ?debugMsg("t2 test 1") end,
fun() -> ?debugMsg("t2 test 2") end,
fun() -> ?debugMsg("t2 test 3") end]}.
t_test_() ->
{setup,
fun top_setup/0,
fun top_cleanup/1,
[{generator, fun test_t1/0},
{generator, fun test_t2/0}]}.
Компиляция этого модуля и его последующее выполнение из оболочки Erlang дают ожидаемый результат:
1> c(t).
{ok,t}
2> eunit:test(t).
/tmp/t.erl:7:<0.291.0>: top setup
/tmp/t.erl:14:<0.293.0>: t1 setup
/tmp/t.erl:16:<0.295.0>: t1 test 1
/tmp/t.erl:17:<0.295.0>: t1 test 2
/tmp/t.erl:18:<0.295.0>: t1 test 3
/tmp/t.erl:15:<0.293.0>: t1 cleanup
/tmp/t.erl:22:<0.293.0>: t2 setup
/tmp/t.erl:24:<0.300.0>: t2 test 1
/tmp/t.erl:25:<0.300.0>: t2 test 2
/tmp/t.erl:26:<0.300.0>: t2 test 3
/tmp/t.erl:23:<0.293.0>: t2 cleanup
/tmp/t.erl:10:<0.291.0>: top cleanup
All 6 tests passed.
ok
Сначала выполняется общая настройка, затем каждый набор выполняется в скобках со своей собственной настройкой и очисткой, а затем общая очистка выполняется последней.
Комментарии:
1. Ваш пример кода служит хорошей отправной точкой для изучения
eunit
документации. Очень полезно.
Ответ №2:
Вы можете взглянуть на приборы и особенно на setup
один: http://erlang.org/doc/apps/eunit/chapter.html#Fixtures