Тестирование серверной части с использованием фреймворка Gun в Common Test
Ожидает приглашения
Всем привет!
Хотел бы поделится своим решением, поскольку не смог найти подходящее.
Суть проблемы состоит в следующем: имеется бэкэнд мессенджера, который основан на Websockets и необходимо протестировать не только функционал, а также бизнес-логику.
При тестировании таких запросов, как получить информацию пользователя или получить список чатов проблем нет (рис. 1). На данном скриншоте показан обычный синхронный запрос к gen_server, результатом которого является мапа, которая используется при сопоставлении с образцом.

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

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

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

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

P.S. Спасибо за прочтение!
Хотел бы поделится своим решением, поскольку не смог найти подходящее.
Суть проблемы состоит в следующем: имеется бэкэнд мессенджера, который основан на Websockets и необходимо протестировать не только функционал, а также бизнес-логику.
При тестировании таких запросов, как получить информацию пользователя или получить список чатов проблем нет (рис. 1). На данном скриншоте показан обычный синхронный запрос к gen_server, результатом которого является мапа, которая используется при сопоставлении с образцом.

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

Рисунок 2
Логика первой группы тестов:
- Происходит создание чата;
- Пользователь отправляет сообщение в чат;
- Происходит блокировка чата;
- Происходит отправка сообщения в чат, но сервер возвращает ошибку, поскольку чат заблокирован;
- Происходит разблокирование чата;
- Пользователь отправляет сообщение в чат.
Логика второй группы тестов:
- Происходит создание чата;
- Пользователь отправляет сообщение в чат;
- Создание N количества жалоб;
- Происходит отправка сообщения в чат, но сервер возвращает ошибку, поскольку чат заблокирован;
- Происходит разблокирование чата;
- Пользователь отправляет сообщение в чат.
Для реализации данных тесткейсов была попытка создания 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. Спасибо за прочтение!