12. Настройка и очистка во время сборки
Цели обучения
Этот раздел познакомит вас с ловушками в тестовой структуре до и после сборки проигрывателя.
Введение и мотивация
Иногда необходимо изменить настройки или подготовить ассеты перед сборкой для тестов Play Mode. Аналогичным образом, это может быть актуально для очистки вещей после сборки. Для этого тестовый фреймворк имеет две точки подключения, называемые PrebuildSetup и PostBuildCleanup.
В Редакторе PrebuildSetup вызывается перед сборкой и тестовым запуском, а PostBuildCleanup вызывается после завершения тестов. Это происходит как для тестов в режиме редактирования, так и для тестов в режиме воспроизведения. При запуске тестов в режиме воспроизведения на устройстве Cleanup уже запускается сразу после завершения сборки, так как тесты на устройстве выполняются параллельно.
Простейший способ обеспечения того, чтобы испытание имело PrebuildSetup и PostBuildCleanup путем осуществления IPrebuildSetup и IPostBuildCleanup соответственно в вашем тестовом классе.
Часто настройка и очистка будут взаимодействовать с кодом в UnityEditor сборки. На устройстве они недоступны, но наш встроенный код подготовки и очистки должен оставаться в тестовом классе. Поэтому связанные с редактором строки кода рекомендуется оборачивать в #if UNITY_EDITOR Например:
public class MyTestClass : IPrebuildSetup
{
[Test]
public void MyTest()
{
}
public void Setup()
{
#if UNITY_EDITOR
UnityEditor.EditorSettings.serializationMode = SerializationMode.ForceText;
#endif
}
}
Примечание: Если код Редактора не завернут, то вы не увидите никакой ошибки компиляции при запуске в Редакторе, но вы увидите ошибку компиляции, когда попытаетесь запустить тест в проигрывателе.
2010 год
Образец 12_BuildSetupCleanup содержит тест режима воспроизведения для проверки содержания сцены. По сути, это версия теста режима воспроизведения из предыдущего упражнения.
Это можно решить, добавив сцену в настройки сборки, но добавление связанной с тестом сцены в настройки сборки не рекомендуется, так как она может быть включена при сборке для нетестовых целей.
Поэтому задача состоит в создании PrebuildSetup, который добавляет сцену к EditorBuildSettings и PostBuildCleanup, который удаляет её снова.
Проверьте решение, запустив тест как в Редакторе, так и в автономном проигрывателе. Вам нужно будет использовать #if UNITY_EDITOR, чтобы сделать код компиляции для проигрывателя.
Подсказки
-
IPrebuildSetupинтерфейс требуетSetupметод, так что будьте осторожны, что нет[SetUp]методы уже называют это.
Решение
Полное решение доступно в образец 12_BuildSetupCleanup_Solution.
Полное тестовое решение может быть выполнено следующим образом:
using System.Collections;
using System.Linq;
using NUnit.Framework;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
namespace Tests
{
public class SceneTests : IPrebuildSetup, IPostBuildCleanup
{
private string originalScene;
private const string k_SceneName = "Assets/MyGameScene.unity";
public void Setup()
{
#if UNITY_EDITOR
if (EditorBuildSettings.scenes.Any(scene => scene.path == k_SceneName))
{
return;
}
var includedScenes = EditorBuildSettings.scenes.ToList();
includedScenes.Add(new EditorBuildSettingsScene(k_SceneName, true));
EditorBuildSettings.scenes = includedScenes.ToArray();
#endif
}
[UnitySetUp]
public IEnumerator SetupBeforeTest()
{
originalScene = SceneManager.GetActiveScene().path;
SceneManager.LoadScene(k_SceneName);
yield return null; // Skip a frame
}
[Test]
public void VerifyScene()
{
var gameObject = GameObject.Find("GameObjectToTestFor");
Assert.That(gameObject, Is.Not.Null, $"GameObjectToTestFor not found in {SceneManager.GetActiveScene().path}.");
}
[TearDown]
public void TeardownAfterTest()
{
SceneManager.LoadScene(originalScene);
}
public void Cleanup()
{
#if UNITY_EDITOR
EditorBuildSettings.scenes = EditorBuildSettings.scenes.Where(scene => scene.path != k_SceneName).ToArray();
#endif
}
}
}
Примечание: #if UNITY_EDITOR также используется среди заявлений об использовании, чтобы позволить ссылку на использование UnityEditor.