Одиннадцатый день 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. Он сначала компилирует проект и, если в скрипте ошибка, сразу останавливается. Потом разом прогоняет пять быстрых наборов: сеть, задержку, движение, мир и рыбу.
Его можно запускать после каждой заметной правки, а полный прогон — перед коммитом.
Что осталось в игре
- Проход до босса — 90 секунд, из них 71 боты идут и дерутся. Это теперь самая долгая часть прогона.
- Запускаются все наборы, даже если менялась одна система. Следующий шаг — гонять только затронутые.
- Пассажир лодки отстаёт от своего места, когда машина занята. Вести его надо от лодки, а не от его собственного движения.
- Сеть под сильной перегрузкой расходится. Для слабых компьютеров это важно, разбор впереди.
- Проверка того, как стая замечает стрелка, проходит не всегда и ждёт разбора.
