Как боты помогают тестировать игры
Введение
Привет, меня зовут Евгений. Я младший разработчик в команде новой мобильной MMORPG.
Разработка игры в жанре MMORPG — сложный и трудоемкий процесс. В таких играх много механик, которые зачастую наслаиваются друг на друга. Изменения в одной части игры могут выстрелить в совершенно другой.
Так, в нашей игре сотни квестов, и каждый из них нужно тестировать. Например, удалили моба с локации, а после теста оказалось, что он был нужен в середине сюжетной цепочки квестов. Для таких случаев можно нанять армию QA, которые будут каждый день вдоль и поперек проверять все квесты в игре. А можно переложить тестирование квестов на ботов!
Почему боты?
Главное преимущество ботов — действие по одному алгоритму. Если они застряли на квесте, который еще вчера спокойно выполняли, значит, стоит обратить внимание на этот квест.
Но в неизменности алгоритма заключается и главная слабость ботов — они не способны выйти за рамки кода, написанного мной. Сложные кейсы они не могут воспроизвести. Поэтому боты — всего лишь дополнение к большой системе тестирования в моей компании. Для наших QA они — отличные помощники, готовые взять на себя самую монотонную и скучную работу.
Что тестируют боты?
Тестирование ботами затрагивает следующие направления:
Квесты — боты начинают исследовать мир игры с первого уровня. Выполняют квесты, изучают таланты, улучшают экипировку и проверяют, возможно ли пройти квест, если действовать по стандартному алгоритму.
Дейлики — боты проверяют квесты дейловых зон, корректную работу сервера при смене пула квестов в дейловых зонах.
PvP Арена — в игре несколько режимов арен, отличающихся механиками. Проверяется доступность всех режимов арены и начисление награды за победу. Также проверяется работа аренного матчмейкинга.
PvE Подземелья — подземелья в Skylore генерируются случайным образом. Поэтому боты проверяют, возможно ли найти и убить финального босса. Также тестируется матчмейкинг для подземелий.
Нагрузочное тестирование игрового сервера. Помогают проверить, что сервер способен выдержать нагрузку большим количеством активных игроков.
Стек технологий
Для организации системы тестирования мы используем:
Microsoft .NET 5 — фреймворк, на котором написаны сами боты: их логика и модуль управления.
Jenkins — инструмент, позволяющий запускать тестирование в назначенное время и с определенной регулярностью.
ElasticSearch — отвечает за сбор и хранение результатов тестирований.
Kibana — позволяет визуализировать данные из ElasticSearch.
А что за боты такие?
Система ботов написана на C#, и выбор языка не случаен. Наш игровой сервер написан на C#, это позволяет переиспользовать серверный код и написанные для него библиотеки.
Проект состоит из двух частей: модуль управления всеми ботами и поведенческий модуль. Модуль управления — ASP.NET проект с графическим интерфейсом. Он отвечает за связь с игровым сервером, дергает нужные API сервера и отдает команду о запуске бота модулю поведения. Модуль управления имеет свой UI-интерфейс для простоты использования. Также существует набор API-методов для каждого из модулей.
Модуль поведения отвечает за поведение ботов. Важный момент, что с точки зрения игрового сервера боты — обычные игроки. В этом модуле происходит обработка и отправка клиент-серверных пакетов.
К модулю управления ссылаются один и более модулей поведения, на каждом из которых работают боты. Поведенческие модули можно запускать на нескольких машинах. Это делает систему масштабируемой и позволяет создавать огромную нагрузку на игровой сервер.
Поведение ботов
Логика ботов достаточно простая. Раз в несколько секунд бот выполняет одно из доступных ему действий. Они расположены в порядке приоритетности выполнения.
Например:
Атаковать ближайшего врага
Начать диалог с NPC
Изучить талант
Если поблизости врагов нет, то бот пропустит первое действие и попытается начать диалог с NPC. Предположим, что бот успешно закончил диалог, тогда он снова начнет поиск врагов. Всех противников бот убил, а доступных диалогов нет, в этом случае бот попытается изучить новый талант.
В реальности список действий бота намного больше, а логика внутри действий сложнее, но суть примерно такая.
Как происходит тестирование?
Как я говорил, тестирования происходят ежедневно, их запускает специальная задача в Jenkins. Пайплайн задачи состоит из трех фаз:
Обновление всех сервисов, участвующих в тестировании, чтобы проверялась самая последняя версия игры.
Фаза тестирования. Jenkins отправляет API запрос модулю управления о начале тестирования. Получив команду, модуль управления запускает ботов. Боты выполняют заданные цели, а в конце формируют отчет о тестировании.
Обработка отчетов и отправка результатов в Elasticsearch, отправка уведомлений в случае провала тестирования.
Обработка результатов
Получив результаты от всех ботов, модуль управления начинает их проверять.
Для примера рассмотрим результат тестирования квестов. За отведенное время бот должен выполнить определенное количество квестов. Модуль управления проверяет, не вышло ли время тестирования, какие квесты пройдены успешно, а с какими возникли проблемы. А если бот отключился и не смог закончить тестирование, то мы увидим код возникшей ошибки.
Для каждого вида тестирования существует отдельный отчет, но в каждом из них обязательно есть:
Статус тестирования — имеет два состояния OK и Failure.
Описание результата — пояснение к статусу. Если боты не уложились в заданное время, там будет написано «Testing time expired». А если один из ботов упал, то «Some bot crashed»
Персональные результаты ботов — в них указаны ник бота, его класс, прогресс по тестированию и причина падения, если бот отключился.
Визуализация отчетов
Для визуализации отчетов мы используем Kibana. В нем настроен дашборд с графиком для каждого вида тестирования и ссылка на лог последнего тестирования. Kibana — очень удобное и гибкое средство, которое позволяет получить красивое представление отчета и не требует особых навыков программирования.
Особенности и допущения
На первый взгляд тестирования проходят гладко, но, как и везде, здесь тоже есть свои подводные камни.
Например, всех противников боты убивают моментально с помощью чита на ваншот. Если честно атаковать каждого противника, тестирования будут занимать намного больше времени, а наша цель — проверить максимальное количество контента в минимальные сроки.
В некоторых квестах требуется выбрать правильный вариант ответа, так как боты не умеют анализировать текст вопроса, то и ответы перебирают в рандомном порядке. Вариантов ответа, как правило, не больше четырех, поэтому достаточно быстро выбирают правильный.
Иногда доступные квесты заканчиваются, а чтобы получить новые, обычному игроку нужно потратить время на прокачку. Боты делают проще: с помощью чита повышают свой уровень и получают доступ к новым квестам.
Есть квесты с интересными и необычными уникальными механиками, а учить бота проходить каждый из них слишком долго и зачастую малоэффективно. Такие квесты мы заранее вносим в список игнорируемых, и бот выполняет их читом в момент получения. Один из таких квестов — стелс миссия. В ней нужно добраться до точки, путь к которой патрулируют вражеские стражи. Если они заметят игрока, то отправят его в начало пути. Стражи постоянно перемещаются, а вместе с их движением меняется путь к точке. Бот не умеет строить такие сложные маршруты, поэтому мы добавили этот квест в список игнорируемых. Вы могли заметить этот список на скриншоте с результатами тестирования.
Вывод
Внедрение тестирований ботами в наш проект позволяет регулярно находить различные баги и недоработки в наших сервисах. Это экономит нам большое количество времени и помогает сфокусироваться на других не менее важных вещах.
Как сказал мой коллега: «После появления ботов мне намного спокойнее что-то менять в коде сервера, ведь я знаю, что за моей спиной стоят боты, которые помогут найти баг в глубинах контента».