June 22, 2021

Как боты помогают тестировать Skylore

Введение


Привет, меня зовут Евгений. Я младший разработчик компании Aigrind. Сейчас я работаю в команде новой мобильной MMORPG Skylore.


Разработка игры в жанре MMORPG — сложный и трудоемкий процесс. В таких играх много механик, которые зачастую наслаиваются друг на друга. Изменения в одной части игры могут выстрелить в совершенно другой.
Так, в нашей игре сотни квестов, и каждый из них нужно тестировать. Например, удалили моба с локации, а после теста оказалось, что он был нужен в середине сюжетной цепочки квестов. Для таких случаев можно нанять армию QA, которые будут каждый день вдоль и поперек проверять все квесты в игре. А можно переложить тестирование квестов на ботов!


Почему боты?


Главное преимущество ботов — действие по одному алгоритму. Если они застряли на квесте, который еще вчера спокойно выполняли, значит, стоит обратить внимание на этот квест.
Но в неизменности алгоритма заключается и главная слабость ботов — они не способны выйти за рамки кода, написанного мной. Сложные кейсы они не могут воспроизвести. Поэтому боты — всего лишь дополнение к большой системе тестирования в компании. Для наших QA они — отличные помощники, готовые взять на себя самую монотонную и скучную работу.

Что тестируют боты?


Квесты — боты начинают исследовать мир игры с первого уровня. Выполняют квесты, изучают таланты, улучшают экипировку и проверяют, возможно ли пройти квест, если действовать по стандартному алгоритму.
Дейлики — боты проверяют квесты дейловых зон, корректную работу сервера при смене пула квестов в дейловых зонах.
PvP Арена — в игре несколько режимов арен, отличающиеся механиками. Проверяется доступность всех режимов арены и начисление награды за победу. Также проверяется работа аренного матчмейкинга.
PvE Подземелья — подземелья в Skylore генерируются случайным образом. Поэтому боты проверяют, возможно ли найти и убить финального босса. Также тестируется матчмейкинг для подземелий.
Нагрузочное тестирование игрового сервера. Помогают проверить, что сервер способен выдержать нагрузку большим количеством активных игроков.


Стек технологий


Для организации системы тестирования мы используем:
Microsoft .NET 5 — фреймворк, на котором написаны сами боты: их логика и модуль управления.
Jenkins — инструмент, позволяющий запускать тестирование в назначенное время время и с определенной регулярностью.
ElasticSearch — отвечает за сбор и хранение результатов тестов.
Kibana — позволяет визуализировать данные из ElasticSearch.

А что за боты такие?


Система ботов написана на C#, и выбор языка не случаен. Наш игровой сервер написан на C#, это позволяет переиспользовать серверный код и написанные для него библиотеки.
Проект состоит из двух частей: модуль управления всеми ботами и поведенческий модуль. Модуль управления — ASP.NET проект с графическим интерфейсом. Он отвечает за связь с игровым сервером, дергает нужные API сервера и отдает команду о запуске бота модулю поведения. Модуль управления имеет свой UI-интерфейс для простоты использования. Также существует набор API-методов для каждого из модулей.


Модуль поведения отвечает за поведение ботов. Важный момент, что с точки зрения игрового сервера боты — обычные игроки. В этом модуле происходит обработка и отправка клиент-серверных пакетов.


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

Поведение ботов


Логика ботов достаточно простая. Раз в несколько секунд бот выполняет одно из доступных ему действий. Они расположены в порядке приоритетности выполнения.
Например:
1. Атаковать ближайшего врага
2. Начать диалог с NPC
3. Изучить талант

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


Как происходит тестирование?


Как я и говорил, тесты проходят ежедневно, и их запускает специальная задача в Jenkins. Пайплайн задачи состоит из трех фаз:
1. Обновление всех сервисов, участвующих в тестировании, чтобы проверялась самая последняя версия игры.
2. Фаза тестирования. Jenkins отправляет API запрос модулю управления о начале тестирования. Получив команду, модуль управления запускает ботов. Боты выполняют заданные цели, а в конце формируют отчет о тестировании.
3. Обработка отчетов и отправка результатов в Elasticsearch, отправка уведомлений в случае провала тестирования.

Обработка результатов


Получив результаты от всех ботов, модуль управления начинает их проверять.
Для примера рассмотрим результат тестирования квестов. За отведенное время бот должен выполнить определенное количество квестов. Модуль управления проверяет, не вышло ли время тестирования, какие квесты пройдены успешно, а с какими возникли проблемы. А если бот отключился и не смог закончить тестирование, то мы увидим код возникшей ошибки.

Вот так данные ботов выглядят в json-файле


Для каждого вида тестирования существует отдельный отчет, но в каждом из них обязательно есть:
Статус тестирования — имеет два состояния OK и Failure.
Описание результата — пояснение к статусу. Если боты не уложились в заданное время, там будет написано “Testing time expired”. А если один из ботов упал, то “Some bot crashed”
Персональные результаты ботов — в них указаны ник бота, его класс, прогресс по тестированию и причина падения, если бот отключился.

Визуализация отчетов


Для визуализации отчетов мы используем Kibana. В нем настроен дашборд с графиком для каждого вида тестирования и ссылка на лог последнего тестирования. Kibana — очень удобное и гибкое средство, которое позволяет получить красивое представление отчета и не требует особых навыков программирования.

Вывод


Внедрение тестирований ботами в наш проект позволяет регулярно находить различные баги и недоработки в наших сервисах. Это экономит нам большое количество времени и помогает сфокусироваться на других не менее важных вещах.


Как сказал мой коллега: “После появления ботов мне намного спокойнее что-то менять в коде сервера, ведь я знаю, что за моей спиной стоят боты, которые помогут найти баг в глубинах контента”.