Автоматическое тестирование игры - PullRequest
29 голосов
/ 18 августа 2008

Вопрос

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

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

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

Введение

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

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

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

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

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

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

Ответы [ 10 ]

8 голосов
/ 18 августа 2008

Эта запись в Игры изнутри может быть актуальной / интересной.

2 голосов
/ 02 мая 2016

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

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

Каркас предоставляет очередь событий, в которой записываются события, данные и эффекты с определенного момента времени. В статье это называется «снимок».

В статье описан пример юнит-теста для заклинания:


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

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

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


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

2 голосов
/ 16 сентября 2008

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

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

2 голосов
/ 18 августа 2008

Однажды я сделал что-то похожее на вашу идею, и оно оказалось очень успешным, хотя я подозреваю, что это действительно скорее системный тест, чем модульный тест. Как вы предлагаете, ваш генератор случайных чисел должен быть засеян с одним и тем же значением и должен каждый раз производить одинаковую последовательность. Игра работала с частотой 50 Гц, поэтому выбор времени не был проблемой. У меня была система, которая записывала щелчки мышью и местоположения, и использовала ее, чтобы вручную создать «сценарий», который можно было бы воспроизвести для получения тех же результатов. Удаляя временные задержки и отключая генерацию графики, можно воспроизвести час игрового процесса за несколько секунд. Самая большая проблема заключалась в том, что изменения в игровом дизайне сделали бы скрипт недействительным.

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

2 голосов
/ 18 августа 2008

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

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

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

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

1 голос
/ 10 августа 2014
1 голос
/ 30 июля 2009

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

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

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

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

1 голос
/ 15 сентября 2008

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

1 голос
/ 18 августа 2008

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

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

0 голосов
/ 18 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...