Подтвердить что ты не робот

Автоматическое тестирование игры

Вопрос

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

Я считаю, что вы можете unit test использовать множество функций игрового движка (создание сетей, создание объектов, управление памятью и т.д.), но можно ли автоматизировать тестирование самой реальной игры?

Я не говорю об элементах игрового процесса (например, Протосс избил Зерга на карте X), но я говорю о взаимодействии между игрой и движком.

Введение

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

Возможные ответы

Моя идея такова:

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

Затем создайте уровень голой кости, который содержит пару объектов, с которыми может взаимодействовать аватар/пользователь. Начните с малого, а затем добавьте объекты на уровень по мере развития большего количества взаимодействий.

Создайте script, который следует за путём (проверяет поиск пути) и взаимодействует с разными объектами (сохраняя результат или ожидаемое поведение). Этот script будет вашим автоматическим тестом. Через определенное время (скажем, одну неделю) запустите script вместе с тестами вашего модуля.

4b9b3361

Ответ 2

Значения настолько случайны в аспектах развития геймплея, что было бы надуманной идеей протестировать абсолютные значения

Но мы можем проверить детерминированные значения. Например, unit test может иметь Guybrush Threepwood двигаться к двери (поиск пути), открывать дверь (использовать команду), терпеть неудачу, потому что у него нет ключа в его инвентаре (обратная связь), выберите ключ двери (pathfinding + управление запасами), а затем, наконец, открытие двери.

Все эти пути детерминированы. С помощью этого unit test я могу реорганизовать диспетчер памяти, и если он каким-то образом нарушит процедуру управления запасами, unit test завершится с ошибкой.

Это всего лишь одна идея для модульного тестирования в играх. Мне бы хотелось узнать другие идеи, следовательно, мотивацию для этой должности.

Ответ 3

Я сделал что-то подобное вашей идее один раз, и это было очень успешным, хотя я подозреваю, что это скорее системный тест, чем unit test. Поскольку вы предлагаете, чтобы ваш генератор случайных чисел был засеян одним и тем же значением и каждый раз должен иметь идентичную последовательность. Игра проходила на 50 Гц, поэтому время не было проблемой. У меня была система, которая записывала бы щелчки мыши и местоположения и использовала бы это, чтобы вручную генерировать "script", который можно было бы воспроизвести для получения тех же результатов. Удалив задержки синхронизации и отключив графическую генерацию, час игры может быть реплицирован за несколько секунд. Самая большая проблема заключалась в том, что изменения в дизайне игры сделали бы недействительным script.

Если в вашей комнате с баребонами была логика, которая не зависела от общей игры, тогда она могла бы работать очень хорошо. Двигатель может запускаться без каких-либо ui и запускать script, как только инициализация завершена. Тестирование сбоев по пути было бы простым, но более сложные тесты, такие как уход персонажей в правильные положения, были бы более сложными. Если запись сценариев достаточно проста, что они были в моей системе, то их можно легко обновить, а специальные скрипты для тестирования специализированного поведения можно настроить очень быстро. У моей системы было дополнительное преимущество, что ее можно было использовать во время тестирования игры, а также точную последовательность записанных событий, чтобы облегчить исправление ошибок.

Ответ 4

В другом ответе уже упоминалась статья из Power of Two Games Games From Within, но я предлагаю читая все (или почти все) там, так как все они действительно хорошо написаны и непосредственно применяются к разработке игр. Особенно хороша статья статьи о Assert. Вы также можете посетить их предыдущий сайт по адресу Games From Within, в котором много написано о Test Driven Development, который является модульным тестированием, принятым до крайности.

Сила двух парней - это те, кто реализовал UnitCpp, довольно хорошо оцененную модульную систему тестирования. Лично я предпочитаю WinUnit.

Ответ 5

Riot Games имеет статью об использовании автоматизированного тестирования для League of Legends (LoL), многопользовательской онлайн-игры RTS.

По словам разработчиков, есть много изменений как для игрового кода, так и для игрового баланса каждый день. Они построили тестовую инфраструктуру Python, которая в основном является более простым игровым клиентом, который отправляет команды на сервер непрерывной интеграции, на котором запущен экземпляр LoL-сервера. Затем сервер отправляет тестовой структуре эффект команды, позволяя тестировать ответ.

Структура обеспечивает очередь событий, которая записывает события, данные и эффект из определенного момента времени. Статья называет это "моментальным снимком".

В статье описывается пример unittest для заклинания:


Настройка
1. Дайте персонажу способность.
2. Возьмите вражеского персонажа в средней полосе (местоположение на карте).
3. Возьмите ползучесть в средней части. (В контексте LoL крипы являются слабыми неконтролируемыми персонажами, которые являются частью каждой командной армии. Они в основном являются каноническим кормом и являются источником опыта и золота для команды противника. Но если их не остановить, они могут сокрушить противоположные команда) 4. Телепортируйте персонажа к среднему.

Выполнить
1. Сделайте снимок всех переменных (например, текущую жизнь от игрока, врага и обычных персонажей).
2. Бросьте заклинание.
3. Активируйте эффекты заклинания (например, есть некоторые заклинания, которые будут пробиваться при ударе) на вражеском персонаже.
4. Reset время восстановления заклинания, чтобы его можно было снова отменить.
5. Бросьте заклинание.
6. Активируйте эффекты заклинания на ползучести (в контексте LoL, большинство заклинаний имеют разные вычисления при использовании в крипах). 7. Сделайте еще один снимок.

Проверка
Начиная с первого моментального снимка, воспроизводите события и утверждайте, что ожидаемые результаты (с точки зрения дизайнера игры) верны. Примерами событий, которые могут быть проверены, являются: Урон находится в пределах урона от заклинаний (LoL использует случайные числа, чтобы давать отклонения от атак), Damage должным образом сопротивляется по сравнению с персонажем игрока и ползучести, а заклинания выкладываются в пределах его эффективный диапазон.


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

Ответ 6

Если вы тестируете механизм рендеринга, я думаю, вы могли бы отображать определенные тестовые сцены, делать снимки экрана и сравнивать их с эталонными тестовыми визуализациями. Таким образом, вы можете обнаружить, что изменения в двигателе визуально нарушают что-либо. Вы можете написать аналогичный тест для звукового движка или даже анимации (путем сравнения серии кадров).

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

Ответ 7

Если вы используете XNA (эта идея может быть экстраполирована на другие рамки, конечно), вы можете использовать встроенную фреймворком unit test, которая позволяет вам получить доступ к состоянию игры в unit test. Одна из таких рамок Scurvy.Test: -)

Ответ 8

http://flea.sourceforge.net/gameTestServer.pdf

Это интересная дискуссия о внедрении полнофункционального функционального тестера в игре.

Термин "модульное тестирование" означает, что тестируется "единица". Это одно. Если вы выполняете тестирование более высокого уровня (например, несколько систем одновременно), обычно это называется функциональным тестированием. Это может быть unit test большая часть игры, однако вы не можете действительно испытать удовольствие.

Детерминизм не требуется, если ваши тесты могут быть нечеткими. Например. "персонаж пострадал", а не "потерял личность 14,7 хитпоинтов".

Ответ 9

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