Почему не существует сторонних библиотек утверждений для Common Test?
Когда я пишу тесты, я пишу всевозможные маленькие вспомогательные функции, чтобы делать утверждения. Я искал библиотеку утверждений и ничего не нашел. В моих тестах у меня часто бывают такие вещи:
value_in_list(_Value, []) ->
false;
value_in_list(Value, [Item|List]) ->
case Value == Item of
true ->
true;
false ->
value_in_list(Value, List)
end.
test_start_link(_Config) ->
% should return the pid and register the process as my_app
{ok, Pid} = my_app:start_link(),
true = is_pid(Pid),
value_in_list(my_app, registered()).
В итоге мне приходится писать целую функцию, чтобы проверить, является ли my_app зарегистрированным процессом. Было бы намного лучше, если бы я мог просто позвонить assertion:value_in_list(my_app, registered())
или же assertion:is_registered(my_app)
,
Я родом из Ruby, поэтому мне не хочется загромождать свои тесты служебными функциями, чтобы сделать несколько утверждений. Было бы намного чище, если бы я мог просто сделать:
test_start_link(_Config) ->
% should return the pid and register the process as my_app
{ok, Pid} = my_app:start_link(),
true = is_pid(Pid),
assertion:value_in_list(my_app, registered()).
Итак, мои вопросы:
- Почему не существует библиотеки утверждений для Common Test?
- Можно ли будет создать стороннюю библиотеку, которая была бы доступна во время всех тестов?
4 ответа
Я решил написать библиотеку утверждений Erlang, чтобы помочь в таких случаях. Это обеспечивает эту функциональность.
Вы можете просто использовать утверждения EUnit в Common Test.
-include_lib("eunit/include/eunit.hrl").
И все регулярные утверждения доступны.
Некоторые идеи для этого:
Переместите запуск приложения в раздел запуска пакета:
init_per_suite(Config) ->
{ok, Pid} = my_app:start_link(),
true = is_pid(Pid),
[{app, Pid} | Config].
Затем напишите свою регистрацию теста как:
test_registration(Config) ->
Pid = ?config(app, Config),
true = lists:member(Pid, registered()).
Нет необходимости утверждать вещи с помощью явных функций утверждения, поскольку они "встроены". Просто сделайте неудачное совпадение, как описано выше, и процесс тестирования завершится сбоем. И, следовательно, сообщают, что контрольный пример пошел не так. Каждый тестовый пример выполняется в своем собственном процессе. Именно поэтому вы хотите запустить приложение в init_per_suite/1
Перезвоните. Иначе, my_app
будет завершен после запуска тестового примера, так как вы связаны с процессом на тестовый случай.
Таким образом, ответ таков: утверждения встроены. Следовательно, существует меньшая потребность в библиотеке утверждений как таковой.
Кстати, гораздо проще и эффективнее написать первый блок в сопоставлении с образцом в сигнатуре, чем добавлять регистр.
value_in_list(_Value, [] ) -> false;
value_in_list( Value, [Value|List] ) -> true;
value_in_list( Value, [ _ |List] ) -> value_in_list(Value, List).
Я понимаю, что это, вероятно, должен быть просто комментарий к первоначальному вопросу, но это ужасно трудно читать без моноширин и новых строк.