Я хотел бы написать тесты, в которых функции настройки и очистки выполняются не для каждого отдельного теста, а один раз - в начале тестирования и в конце тестирования.
Итак, я попробовал так:
generator_test_() ->
{setup, fun setup/0, fun cleanup/1,
{inorder,
[
some_test1()
%...
]
}
}.
Где some_test1/0
some_test1() ->
begin
Value1 = something1(),
Value2 = something2(),
[?_assertEqual(Value1, Value2)]
end.
Установка не выполняется таким образом.
Но так:
some_test1() ->
?_test(begin
Value1 = something1(),
Value2 = something2(),
[?_assertEqual(Value1, Value2)]
end).
or
some_test1() ->
[?_assertEqual(something1(), something2())].
Все хорошо.
Я не понимаю, почему это работает, и моя проблема в том, что я не могу написать несколько утверждений в ?_test(....).
some_test1() ->
?_test(begin
Value1 = something1(),
Value2 = something2(),
[?_assertEqual(Value1, Value2),
?_assertEqual(Value1, Value2)]
end).
Запустив eunit:test(my_module, [verbose]).
вижу, что пройден только 1 тест.
ОБНОВИТЬ
Пример 1
Небольшой пример:
-module(example).
-include_lib("eunit/include/eunit.hrl").
generator_test_() ->
{setup, fun setup/0, fun cleanup/1,
{inorder,
fun() -> some_test1() end
}
}.
some_test1() ->
begin
X = 3,
Y = 4,
%%% This is a test set/deep list as it
%%% contains two tests.
[?_assertEqual(X, Y),
?_assertEqual(ok, ok)]
end.
setup() ->
erlang:display("---SETUP CALLED---"),
"setup".
cleanup(_) ->
ok.
Запуск устройства:
eunit:test(example, [verbose]).
======================== EUnit ========================
"---SETUP CALLED---"
module 'example'
example: generator_test_...ok
[done in 0.004 s]
=======================================================
Test passed.
ok
Небольшая модификация:
some_test1() ->
begin
X = 3,
Y = 4,
%%% This is a test set/deep list as it
%%% containst two tests.
[?_assertEqual(X, Y),
?_assertEqual(it_doesnt_work, ok)]
end.
И тест все равно проходит.
Пример 2
тем не мение
some_test1() ->
begin
X = 3,
Y = 4,
%%% These are just two simple tests
?assertEqual(X, Y),
?assertEqual(it_doesnt_work, ok)
end.
Не удается
eunit:test(example, [verbose]).
======================== EUnit ========================
"---SETUP CALLED---"
module 'example'
example: generator_test_...*failed*
in function example:'-some_test1/0-fun-0-'/1 (example.erl, line 17)
in call from example:some_test1/0 (example.erl, line 17)
**error:{assertEqual_failed,[{module,example},
{line,17},
{expression,"Y"},
{expected,3},
{value,4}]}
[done in 0.003 s]
=======================================================
Failed: 1. Skipped: 0. Passed: 0.
error
НО
Пример 3
generator_test_() ->
{setup, fun setup/0, fun cleanup/1,
{inorder,
some_test1()
}
}.
some_test1() ->
[?_assertEqual(3, 3),
?_assertEqual(ok, ok)].
eunit:test(example, [verbose]).
======================== EUnit ========================
"---SETUP CALLED---"
module 'example'
example:13: some_test1...ok
example:14: some_test1...ok
[done in 0.005 s]
=======================================================
All 2 tests passed.
ok
Теперь я вижу, что тестов было 2(!)
Я мог бы просто забыть оператор блока и писать тесты без переменных, но я думаю, что это было бы ужасно читать, и это должно работать с блоками.