Общий метод настройки и демонтажа для наборов тестов Erlang Eunit

#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