← все статьи

Titancraft, день одиннадцатый: тесты за три с половиной минуты вместо тринадцати

Одиннадцатый день Titancraft. Перед каждым коммитом игра прогоняет 12 наборов автотестов: сервер и боты-игроки идут к руинам, бьют босса, строят дом, стреляют в дерево, гребут вдвоём на лодке. Прогон шёл 13 минут. Игра скоро вырастет в несколько раз, а с ней и тесты, поэтому сегодня ускоряли сами тесты: теперь полный прогон укладывается в 3,5 минуты.

Куда уходило время

Каждый набор поднимает свой мир: сервер и одного-двух клиентов-ботов, без окон. Боты играют по сценарию. Через заданное число секунд каждая копия игры печатает итог — кто где стоит, что построено, что в рюкзаке, — и набор сверяет итоги между собой.

Таймер ставили с запасом. По журналам видно, что почти всё время наборы просто ждали: двое ботов убивают босса на 71-й секунде, а набор ждал до 204-й. Последнюю стрелу из дерева достают на 23-й секунде из 64.

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

Три шага

Одновременно. У каждого набора свой порт и свои временные миры, а боты без имени персонажа ничего не сохраняют, так что наборам нечего делить. Начали запускать по четыре сразу, и прогон стал 4,5 минуты. Упёрлись в самый долгий набор — проход до босса.

Ранний итог. У игры появился ключ --stop-file. Набор следит за журналами, и когда случилось всё нужное — босс убит, стрелы достали, дерево срублено, игрок вошёл в мир, — создаёт файл. Все копии игры сразу печатают итог и выходят. Прежний таймер остался запасным пределом. Проход до босса стал занимать 90 секунд, стрелы — 33.

Внутри наборов — тоже разом. Пять сценариев движения проходят за 12 секунд вместо 58, два боя с легендарным оружием — за 33 вместо 75.

Где пришлось притормозить

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

Теперь tests/run.sh считает не наборы, а копии игры: у одного набора их одна, у другого шесть. Разом идёт не больше десяти, а наборы lag и boat идут в конце по одному. Это стоит 76 секунд, зато не приходится гадать, где ошибка — в игре или в нагрузке.

Короткий набор

Для проверки после правок появился tests/run.sh quick. Он сначала компилирует проект и, если в скрипте ошибка, сразу останавливается. Потом разом прогоняет пять быстрых наборов: сеть, задержку, движение, мир и рыбу.

tests/run.sh quick
$ tests/run.sh quick
[12:26:36] компиляция без ошибок
[12:26:52] << moves пройден за 12 с (5 проверок)
[12:27:08] << net пройден за 15 с (2 проверок)
[12:27:22] << world пройден за 45 с (5 проверок)
[12:27:39] << lag пройден за 16 с (1 проверок)
[12:27:43] << fish пройден за 0 с (9 проверок)
Итог: все наборы пройдены (5) за 70 с
Короткий набор после правок — за минуту с небольшим

Его можно запускать после каждой заметной правки, а полный прогон — перед коммитом.

Что осталось в игре

  • Проход до босса — 90 секунд, из них 71 боты идут и дерутся. Это теперь самая долгая часть прогона.
  • Запускаются все наборы, даже если менялась одна система. Следующий шаг — гонять только затронутые.
  • Пассажир лодки отстаёт от своего места, когда машина занята. Вести его надо от лодки, а не от его собственного движения.
  • Сеть под сильной перегрузкой расходится. Для слабых компьютеров это важно, разбор впереди.
  • Проверка того, как стая замечает стрелка, проходит не всегда и ждёт разбора.

Нужна система, которая проверяет себя сама?
Начните с брифа: четыре вопроса и честный ответ, подходим ли мы друг другу.
Пройти бриф