Почему не существует сторонних библиотек утверждений для 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).

Я понимаю, что это, вероятно, должен быть просто комментарий к первоначальному вопросу, но это ужасно трудно читать без моноширин и новых строк.

Другие вопросы по тегам