qmax
@qmax
программер

Как тестить асинхронного многоголового дракона?

Написал асинхронный сервер о нескольких головах:

ORM (django), frontend (django, websocket, jsonrpc), frontend API, самодельный cron, большая голова, маленькая голова, backend api, источник энтропии (asterisk).


Головы общаются между собой прямыми вызовами методов, defered/callbacks и observable/events.

Логика компонентов определяется их поведением и реакцией на всяческие ситуации, сигнализируемые через евенты.

Изменения состояний тоже сигнализируется через евенты.

Все возможные режимы поведения сосредоточены в одном центральном компоненте.

Поток управления прямыми вызовами боле-менее линеен: API -> большая голова -> маленькая -> backend -> asterisk.

Поток евентов в общем-то тоже (в обратном направлении).

Общая логика поведения организутся в кучу микро-workflow (обработка звонков), которые относительно слабо связаны.


Вопрос — как тестировать такую конструкцию?

Какие вообще методологии бывают на такие случаи?

Как разделять — понятно, но как властвовать — не очень.


Основной источник энтропии и асинхронности (asterisk) я могу с некоторой достоверностью сэмулировать говорящей болванкой, чтобы генерить предсказуемые входные данные.

Но вот что делать со всем остальным, и особенно с время-зависимыми процессами — совсем нет идей. И страшно.


Обучен только методу unit-testing, который тут совсем не в тему.
  • Вопрос задан
  • 3692 просмотра
Пригласить эксперта
Ответы на вопрос 3
yeg
@yeg
Вопрос сформулирован не очень четко, не вполне понятно, в чем именно заключается проблема это всё протестить, и почему время-зависимые процессы тут представляют сложность. Рискну предложить столь же расплывчатую схему действий (безо всяких методологий, а на пальцах):

1. В идеале — написать подробные сценарии использования (Use Case) для регулярной проверки правильной работы бизнес-логики.
2. Описать каждый интерфейс, который там есть.
3. Для каждого интерфейса понаписать заглушек, которые возвращают правильные значения, но ничего не делают.
4. Протестировать интерфейсы каждого компонента отдельно с помощью заглушек.
5. Протестировать каждый workflow по сценариям использования. Где есть временные лакуны — можно поставить искусственные задержки, лучше случайные, но чтобы из значение писалось в логи.
6. Написать автоматические тесты для всех интерфейсов и для прогона сценариев, если это возможно, и запускать после каждой доработки. Курить логи.
7. Проводить творческое тестирование на тему «как бы его еще обрушить»?
Ответ написан
yeg
@yeg
Если оборудование позволяет, можно на каждое событие (набрал, посигналил, сделал грустное лицо) класть в лог запись соответствующего вида, и потом шерстить логи скриптом на предмет правильной последовательности событий.
Ответ написан
m08pvv
@m08pvv
Если хотите проверить на корректность модель взаимодействия, то можете (упростив до необходимого минимума) выписать на специальном языке свою систему и проверить на наличие проблем в графе — LTSA
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы