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

Вопрос

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

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

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

Вступление

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

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

Моя идея заключается в следующем:

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

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

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

18.08.2008 01:44:57
flea.sourceforge.net/gameTestServer.pdf Это интересное обсуждение по внедрению полноценного функционального тестера в игру. Термин «модульное тестирование» подразумевает, что «блок» тестируется. Это одно. Если вы проводите высокоуровневое тестирование (например, несколько систем одновременно), обычно это называется функциональным тестированием. Можно протестировать большую часть игры, но вы не можете протестировать для удовольствия. Детерминизм не нужен, если ваши тесты могут быть нечеткими. Например, «получил ли персонаж травму», а не «потерял ли он 14,7 очков жизни»
dash-tom-bang 29.07.2009 21:20:04
(Ой, извините за stackoverflow.fail. Прошло много времени с тех пор, как я был рядом!)
dash-tom-bang 29.07.2009 21:20:49
Вы имеете в виду «автоматизированное тестирование», когда говорите о «модульном тестировании»?
Andrew Grimm 4.12.2009 02:11:01
@ Андрей, ты прав. Я имел в виду автоматизированное тестирование. / Отредактировано
MrValdez 7.12.2009 08:05:07
10 ОТВЕТОВ

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

0
18.08.2008 03:34:25

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

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

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

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

2
18.08.2008 04:24:39

Этот пост в Games From Inside может быть актуальным / интересным.

8
12.06.2009 00:22:03
Статья, кажется, была удалена. PO2G теперь выглядит как ссылочный спам-сайт :-(
richq 11.06.2009 19:09:44
Спасибо за поднятие флага. PO2G вышел из бизнеса. Однако Ноэль Ллопис переместил весь контент блога в свой блог в Games From Within. Я обновил ссылки соответственно.
Anthony Cramp 12.06.2009 00:23:36

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

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

2
18.08.2008 07:18:24

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

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

1
18.08.2008 08:49:19

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

1
15.09.2008 13:57:05

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

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

2
23.05.2017 12:33:26
Возможно, вы захотите изменить ссылки Power of Two Games, чтобы они указывали на Игры изнутри. PO2G больше не размещает содержательный контент.
Anthony Cramp 12.06.2009 00:24:53
Power of 2 Games написал UnitTest ++, который доступен по адресу sourceforge.net/projects/unittest-cpp . Это довольно здорово.
dash-tom-bang 29.07.2009 21:23:08

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

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

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

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

1
29.07.2009 21:24:03

В 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 использует случайные числа, чтобы придать дисперсию атакам), Урону должным образом противостоят по сравнению с персонажем игрока и крипом, и заклинания разыгрываются в пределах его эффективный диапазон.


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

3
2.05.2016 09:51:05