Стратегия тестирования для игр

13

Я унаследовал сетевую образовательную игру. За прошедший год я работал над стабилизацией кода и добавлением новых функций. Большая часть логики находится во внешнем интерфейсе, поэтому внутренние модульные тесты, хотя и полезны, покрывают небольшой процент кода.

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

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

Когда дело доходит до игр, я заблудился. Как мне их проверить? У меня есть тестеры для меня. Я могу потратить время на написание юнит-тестов.

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

Модульные тесты кажутся ограниченными. Поскольку большая часть логики - это javascript (а я унаследовал код спагетти), я могу использовать внешний интерфейс, такой как Cucumber или selenium, для обеспечения работы определенных функций.

Это лучшая стратегия? Как игровые компании тестируют игры?

Я прочитал вопрос « Разработка через тестирование для сложных игр » (среди прочего на сайте), но он не касается того, что я ищу. Я прошу стратегии, а не конкретные примеры того, как тестировать.

jeffkolez
источник
Рекомендации по ресурсам книг / сторонних ресурсов явно не относятся к теме справочного центра . См meta.programmers.stackexchange.com/questions/6483/...
комар
Это не дубликат. Этот вопрос спрашивает, как написать модульные тесты. Я прошу стратегии.
Джеффколес
2
FWIW, когда дело доходит до тестирования графического интерфейса, это больше не модульные тесты - это больше похоже на интеграционные тесты или приемочные тесты
slebetman

Ответы:

16

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

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

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

  • Макет / огрызок сильно . Держите проверенные детали маленькими и дразните все, на что они полагаются.

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

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

  • Рефакторинг . Если тесты становятся чрезмерно сложными или если вы видите, что класс для тестирования требует двенадцать аргументов после внедрения Dependency Injection, тогда как раньше требовалось только два, вам необходимо провести рефакторинг кода.

  • Вопрос фактические бизнес-правила приложения. Я перестал считать количество проектов, которые было практически невозможно протестировать из-за количества различных вариантов, требуемых функциональными требованиями, которые никому не нужны и не понятны, даже заинтересованным сторонам.

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

Наконец, автоматизируйте каждый тест . Тестеры необходимы для обнаружения ситуаций, когда приложение не работает. Использование тестеров для повторного выполнения одного и того же действия в каждой ревизии является контрпродуктивным и неуважительным для тестировщиков: регрессионное тестирование должно выполняться машинами, а не людьми. С другой стороны, люди гораздо лучше находят возможные ошибки. «Что если я ...» - это один из методов, которые они могут использовать («Что, если я введу несколько мегабайт двоичных данных, содержащих несколько \ x00, в поле, которое запрашивает мой возраст, и посмотрим, что произойдет?»), но можно использовать и более формальные подходы.

Арсений Мурзенко
источник
Спасибо за ваши комментарии. Похоже, у меня много работы!
Джеффколес