Hero background image

Советы по тестированию и обеспечению качества для проектов Unity

Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Модульное тестирование

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

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

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

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

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

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

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

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

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

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

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

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

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

График динамики и таблица Coverage

Разработка через тестирование

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

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

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

Для получения дополнительной информации о TDD в Unity смотрите блог-пост «Тестирование разработки через тестирование с помощью Unity Test Runner.»

Охват кода

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

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

Смотрите блог-пост «Code Coverage: Обнаружение пробелов в ваших тестах» для получения дополнительной информации.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

График GPU для игры

Тестирование производительности

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

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

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

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

Профайлер Unity

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

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

Узнайте больше о настройке Профайлера на сессии 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, коллекцией образцов для наших серверных услуг, чтобы изучить примеры того, как вы можете настроить A/B тестирование в игре.

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

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

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

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

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

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

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

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

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

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

Найдите более продвинутые руководства и статьи на центре лучших практик Unity.

Лучшие практики тестирования и контроля качества в разработке игр | Unity