Как мы реализовали нагрузочное тестирование игрового сервера

Team Leader
Время чтения: 5 минут
…По команде, не ведая сомнений и страха поражения, несколько тысяч клонов ринулись по узким сетевым коридорам, чтобы сойтись в поединке. И победить. Клоны — не мастера боя. Но они четко выполняют инструкции, которые приведут их к цели.
Нет, это не фрагмент легендарной саги «Звездные войны», это алгоритм нагрузочного тестирования сервера, построенного на технологиях Java, который наша команда использовала в ходе разработки игрового приложения «Покер» для социальных сетей. Наш алгоритм не только прост в реализации, но и обеспечивает неплохой уровень умения автоматическим игрокам, позволяя тестировать функции приложения наравне с игроками реальными.
Задачи и особенности алгоритма нагрузочного тестирования игрового сервера
На начальной стадии разработки flash-клиента игры нам потребовалось протестировать возможности сервера и оценить его производительность. Для решения задачи и проведения интеграционного и нагрузочного тестирований игрового сервера было решено описать алгоритм инструкций для автоматических игроков в покер или просто «ботов».
В созданном алгоритме игры клоно-ботов в социальных сетях, поведение клона зависело от текущего состояния игровой ситуации и набора карт. Несмотря на то, что мы не ставили цели создать автоматического игрока с высоким мастерством и наш алгоритм прост в реализации, он оказался весьма эффективным, позволяя проводить тестирование игрового сервера ботами наравне с реальными игроками. И зачастую клоны брали победу у людей, но не умением, а числом.
Суть алгоритма
При разработке игрового сервера использовалось модульное тестирование, позволяющее проверить функциональность отдельных классов. Не обошлось без него и при разработке «мозга» движка — расчета покерной «руки», т. е. определения выигрышной комбинации карт в ходе раздачи карт.
Как вы знаете, правила покера выделяют следующие выигрышные комбинации:
- Старшая карта;
- Пара — две карты одного достоинства;
- Две пары — две пары одного достоинства;
- Сет — три карты одного достоинства;
- Стрит — последовательность из пяти карт разной масти;
- Флеш — любые пять карт одной масти;
- Фул-хауз — три карты одного достоинства и две карты тоже одного достоинства;
- Каре — четыре карты одного достоинства;
- Стрит-флеш — последовательность из пяти карт одной и той же масти;
- Флеш-рояль — пять старших карт какой-либо одной масти.
Так, у нас имеются 10 выигрышных комбинаций карт и в простом случае максимально за 10 циклов расчета можно найти текущую комбинацию. Но даже начинающий игрок покера заметит, что часть игровых комбинаций имеет общие свойства: например, у стрит-флеш есть свойства и стрита — последовательности из пяти карт — и флеша — все карты одной масти. Учитывая эту особенность, число циклов расчета удалось сократить до 4. В результате у нас был сформирован набор модульных тестов на каждую комбинацию, но полной уверенности в правильности расчета не было. Поэтому был добавлен тест расчета случайных комбинаций.
Тест выигрышных комбинаций
-
HIGH_CARD 17.497% 34994 ONE_PAIR 43.847% 87694 TWO_PAIR 23.4185% 46837
SET 4.8045% 9609 STRAIGHT
FLUSH
4.653% 9306 FULL_HOUSE 2.989% 5978 FULL_HOUSE 2.581% 5162 QUADS
STRAIG
0.175% 350 HT_FLUSH 0.033% 66 ROYAL_FLUSH 0.0020% 4
HandsNumber: 200 000
Time: 3172
В данном тесте идет расчет 200 000 случайных комбинаций из 7 карт, и представлено число выпадения комбинации в процентном и численном соотношениях, например, сет выпал в тесте 9609 раз в 4.8045% случаев.
Результаты тестирования
Полученный алгоритм тестирования нас здорово выручил: сравнивая результаты теста с вероятностью выпадения покерной комбинации, мы нашли и исправили ошибку, возникавшую из-за того, что изначально не учли ряд особых правил в комбинациях, которые опытным игрокам прекрасно известны.
Надеемся, что вам наш опыт тоже пригодится. Если у вас возникнут вопросы по тестированию или реализации игр для социальных сетей или любых других серверных приложений — пишите, будем рады помочь.
Комментарии