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

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

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

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

Если вы любите играть и/или смотреть спорт, то знаете, что во многих матчах чемпионат выигрывает защита. Рассматривайте процесс QA как стратегию защиты, которая не оставляет шансов, когда речь заходит о выпуске игры с наилучшей производительностью и стабильностью.

Почему тестирование и обеспечение качества важны?

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

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

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

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

Кто отвечает за тестирование и QA?

Вы работаете в небольшой студии, где нет специальной команды QA? Соберите рабочую группу друзей для помощи в тестировании или привлеките стороннего поставщика услуг контроля качества. Даже студии со штатной командой QA часто прибегают к услугам сторонних компаний для дополнительного тестирования, например, тестирования локализации (LQA).

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

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

Как проводить QA и тестирование игры?

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

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

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

Окно модульного тестирования в редакторе Unity
Модульное тестирование

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

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

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

Ручное тестирование модулей

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

Примером ручного модульного тестирования в Unity может служить добавление условия проверки для функции и использование Debug.Log для вывода критериев ее прохождения или неудачи (вывод тестовых сценариев) с помощью режима Play в Unity.

Автоматизированное тестирование модулей

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

Пакет Unity Test Framework (UTF) предоставляет разработчикам основу для написания собственных автоматизированных тестов в режимах редактирования и воспроизведения в редакторе Unity. UTF ищет тест внутри любой сборки, которая ссылается на NUnit. Такие сборки называются TestAssemblies. Тесты режима воспроизведения и режима редактирования должны находиться в отдельных сборках.

UTF предоставляет окно Test Runner в редакторе, чтобы помочь вам запускать и управлять тестовыми случаями.

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

Пакет Unity, Performance Testing Extension - это расширение, которое можно использовать с UTF. Он предоставляет дополнительные API для проведения измерений и получения пользовательских показателей из тестовых примеров.

Узнайте, как начать работу с Unity Test Framework, прочитав учебник по Unity Test Framework для разработки видеоигр.

График динамики и таблица Coverage
Разработка, управляемая тестами

Тестовая разработка (Test-driven development, TDD) - это техника, которая предполагает написание тестов для функциональности перед написанием кода для ее реализации. Обычно этот процесс включает в себя написание неудачного теста, написание минимального количества кода, необходимого для того, чтобы тест прошел, а затем рефакторинг кода, чтобы сделать его более удобным для обслуживания, прежде чем переходить к разработке следующего тестового случая.

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

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

Подробнее о TDD в Unity читайте в блоге "Тестирование разработки, управляемой тестами, с помощью Unity Test Runner".

Охват кода

Если вы хотите внедрить TDD или модульные тесты, воспользуйтесь пакетом Unity Code Coverage. При использовании UTF пакет Code Coverage может показать вам, какие строки кода в вашем проекте проходят тестирование, чтобы помочь вам определить уязвимые или непроверенные части проекта.

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

См. запись в блоге "Code Coverage: Выявите пробелы в ваших тестах" для получения дополнительной информации.

Интеграционное тестирование

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

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

Вы можете использовать UTF для создания интеграционных тестов в Unity. Используя методы SetUp и TearDown, вы можете создать среду для одновременного тестирования нескольких систем. Логика и ввод игрока могут быть смоделированы, особенно если вы реализовали их с помощью шаблона команд (а если вы используете новую систему ввода, то, скорее всего, так и есть), чтобы вы могли протестировать полный поток ввода игрока в логику игры.

Регрессионное тестирование

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

По мере расширения игрового мира и механики возникает необходимость в регрессионном тестировании, которое может оказаться дорогостоящим. Поэтому важно автоматизировать ее везде, где это возможно. Регрессионное тестирование должно проводиться параллельно с разработкой новых функций, особенно если вы ориентируетесь на несколько платформ.

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

Функциональное тестирование

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

Большинство модульных тестов сосредоточены на определенном пути через код, проверяя, возвращает ли он правильные выходные данные на основе определенных входных данных. Он не может проверить, делает ли игра то, для чего она предназначена.

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

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

Функциональное тестирование наиболее эффективно, когда требования четко определены и прописаны. Таким образом, он может быть полезен для заключения контрактов с фрилансерами или студиями на поставку компонентов игрового процесса или активов игрового мира.

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

График GPU для игры
Тестирование производительности

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

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

Различные типы тестов производительности включают в себя:

  • Нагрузочные испытания: Определяет производительность игры при высоких нагрузках
  • Стресс-тесты: Оценивает, как игра справляется с неожиданными ситуациями, такими как внезапное повышение активности игроков
  • Испытания на выносливость: Оценивает, как игра работает в течение длительных периодов времени

Профилировщик Unity

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

Profiler можно расширить, чтобы настроить представление данных, которые вы хотите захватить, и то, как они будут визуально представлены в окне Profiler.

Узнайте больше о настройке профилировщика на занятии Unite 2022 "Как настроить показатели производительности в профилировщике Unity".

Вы также можете написать свои собственные инструменты для создания автоматизированного тестирования производительности. Чтобы узнать, как к этому подойти, посмотрите выступление разработчиков Monument Valley, компании ustwo Games, на конференции Unite 2022: "Создание Альбы: Как создать производительную игру с открытым миром."

A/B-тестирование на метриках и событиях
A/B-тестирование

Тестирование не ограничивается поиском ошибок и контролем производительности. Иногда вам может понадобиться сравнить две версии игровых функций, чтобы определить, какая из них вызывает больше интереса у игроков и лучше работает. Это называется A/B-тестированием.

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

A/B-тестирование предполагает случайное распределение игроков по двум группам: Одна группа играет в оригинальную версию игры или функции (контрольная группа), а другая - в измененную версию игры или функции (экспериментальная группа).

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

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

A/B-тестирование обычно предоставляется в качестве внутреннего сервиса, при этом игроки даже не подозревают, что используют другой вариант. В Unity Gaming Services (UGS) есть инструменты для проведения A/B-тестов в вашей игре, подробнее о которых вы можете узнать здесь. Вы также можете ознакомиться с UGS Use Cases, коллекцией примеров для наших бэкэнд-сервисов, чтобы изучить примеры того, как можно настроить A/B-тестирование в игре.

Инструменты для диагностики и тестирования

Cloud Diagnostics Advanced - это инструмент для создания отчетов и анализа аварийных ситуаций на базе Backtrace, который интегрируется с Unity и предоставляет разработчикам подробную информацию о сбоях и исключениях в их играх. Когда происходит сбой, Cloud Diagnostics Advanced делает снимок состояния игры на момент сбоя, включая информацию об окружении, стеке вызовов, куче и регистрах. Этот снимок затем отправляется на серверы Backtrace, где он анализируется для определения основной причины сбоя.

Cloud Diagnostics Advanced также предоставляет подробную аналитику и инструменты отчетности, которые помогут вам выявить тенденции и закономерности в производительности и стабильности ваших игр с течением времени. Алгоритм дедупликации группирует распространенные сбои по их первопричинам в коде, что может быть использовано для определения приоритетов, какие ошибки следует исправлять в первую очередь, чтобы повысить стабильность игры для наибольшего числа игроков.

Больше ресурсов по обеспечению качества для разработчиков игр

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

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

Создайте руководство по стилю C#: Пишите более чистый код, который масштабируется направляет команды на разработку руководства по стилю, чтобы помочь унифицировать их подход к созданию более целостной кодовой базы.

Повышайте уровень своего кода с помощью паттернов программирования игр рассказывает о лучших практиках использования принципов SOLID и общих шаблонов программирования для создания масштабируемой архитектуры игрового кода в вашем проекте Unity.

Создание модульной игровой архитектуры в Unity с помощью ScriptableObjects рассказывает о лучших практиках развертывания ScriptableObjects в игровом производстве.

Мы создали эту серию, чтобы дать практические советы и вдохновить наших самых опытных создателей. Но это не свод правил! Существует множество способов структурировать свой проект Unity; оцените преимущества и недостатки каждой рекомендации, совета или шаблона вместе с коллегами, прежде чем внедрять их.

Более подробные руководства и статьи можно найти в хабе "Лучшие практики Unity".

Понравился ли вам этот контент?