Всем привет!

Хотел бы поделится своим решением, поскольку не смог найти подходящее.

Суть проблемы состоит в следующем: имеется бэкэнд мессенджера, который основан на Websockets и необходимо протестировать не только функционал, а также бизнес-логику.

При тестировании таких запросов, как получить информацию пользователя или получить список чатов проблем нет (рис. 1). На данном скриншоте показан обычный синхронный запрос к gen_server, результатом которого является мапа, которая используется при сопоставлении с образцом.


Рисунок 1



Но например при запросах, при которых создаются нотификации другим пользователям или происходит блокирование чата, возникают проблемы, такие как:

  1. Необходимость проводить авторизацию пользователей в каждом тесткейсе;
  2. Невозможность создания обобщённых тесткейсов, которые можно объединять в группы и тестировать часть бизнес-логики.

Примером может быть следующее: необходимо протестировать автоматическую блокировку чата при каком-то N количестве жалоб. Группы тесткейсов изображены на рис. 2.


Рисунок 2



Логика первой группы тестов:

  1. Происходит создание чата;
  2. Пользователь отправляет сообщение в чат;
  3. Происходит блокировка чата;
  4. Происходит отправка сообщения в чат, но сервер возвращает ошибку, поскольку чат заблокирован;
  5. Происходит разблокирование чата;
  6. Пользователь отправляет сообщение в чат.

Логика второй группы тестов:

  1. Происходит создание чата;
  2. Пользователь отправляет сообщение в чат;
  3. Создание N количества жалоб;
  4. Происходит отправка сообщения в чат, но сервер возвращает ошибку, поскольку чат заблокирован;
  5. Происходит разблокирование чата;
  6. Пользователь отправляет сообщение в чат.

Для реализации данных тесткейсов была попытка создания Websocket соединений в функциях init_per_suite и init_per_group с последующей передачей ID соединений в тесткейсы в конфигурации, но они не увенчались успехом, поскольку происходило закрытие соединений с последующим стэктрейсом:



13:15:25.886 [error] CRASH REPORT Process <0.666.0> with 0 neighbours exited with reason: {owner_gone,{#Ref<0.1267278032.2790260737.23224>,1172533,[{user_id_1,<<"77a97c00-b196-4bbb-94be-adac15ab7e99">>},{user_id_2,<<"c8f8149c-7a95-4d18-b690-ca6bbf906286">>},{ws_user_1,#{connection_pid => <0.666.0>,connection_ref => #Ref<0.1267278032.2790260737.23936>}},{ws_user_2,undefined},{watchdog,<0.103.0>},{tc_logfile,"/home/erlang/IdeaProjects/backend/logs/ct_run.ct_backend@erlang-HP-Compaq-Elite-8300-SFF.2020-02-27_13.15.24/IdeaProjects.backend.privchats_ws_SUITE.log..."},...],...}} in gun:owner_gone/1 line 966 in gun:proc_lib_hack/5 line 654
13:15:25.887 [error] Supervisor gun_sup had child gun started with {gun,start_link,undefined} at <0.666.0> exit with reason {owner_gone,{#Ref<0.1267278032.2790260737.23224>,1172533,[{user_id_1,<<"77a97c00-b196-4bbb-94be-adac15ab7e99">>},{user_id_2,<<"c8f8149c-7a95-4d18-b690-ca6bbf906286">>},{ws_user_1,#{connection_pid => <0.666.0>,connection_ref => #Ref<0.1267278032.2790260737.23936>}},{ws_user_2,undefined},{watchdog,<0.103.0>},{tc_logfile,"/home/erlang/IdeaProjects/backend/logs/ct_run.ct_backend@erlang-HP-Compaq-Elite-8300-SFF.2020-02-27_13.15.24/IdeaProjects.backend.privchats_ws_SUITE.log..."},...],...}} in gun:owner_gone/1 line 966 in context child_terminated



После неудачного поиска решения данной проблемы, пришла идея создания процесса-посредника, который бы создавал соединение и занимался бы отправкой запросов и аккумулированием ответов. Реализация изображена на рис. 3.


Рисунок 3



Пример функции init_per_suite изображён на рис. 4.


Рисунок 4



Пример тесткейса изображён на рис. 5.


Рисунок 5



P.S. Спасибо за прочтение!