Изменение сборки Player для тестирования
Вы можете запустить тесты режима воспроизведения в отдельном проигрывателе для конкретной платформы. Атрибут [TestPlayerBuildModifier] предоставляет ряд настраиваемых параметров для управления свойствами проигрывателя, созданного для запуска ваших тестов.
Изменение параметров сборки Player для тестов режима воспроизведения
Вы можете изменить BuildPlayerOptions для тестового проигрывателя, чтобы добиться настроенного поведения при запуске тестов в режиме воспроизведения. Изменение параметров сборки позволяет изменить целевое место сборки, а также изменить BuildOptions.
Чтобы изменить BuildPlayerOptions, выполните следующие действия:
- Внедрить
ITestPlayerBuildModifier - Ссылка на тип реализации в атрибуте
TestPlayerBuildModifierна уровне сборки.
Следующий пример демонстрирует это:
using UnityEditor;
using UnityEditor.TestTools;
[assembly:TestPlayerBuildModifier(typeof(BuildModifier))]
public class BuildModifier : ITestPlayerBuildModifier
{
public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions)
{
if (playerOptions.target == BuildTarget.iOS)
{
playerOptions.options |= BuildOptions.SymlinkLibraries; // Enable symlink libraries when running on iOS
}
playerOptions.options |= BuildOptions.AllowDebugging; // Enable allow Debugging flag on the test Player.
return playerOptions;
}
}
Примечание: При построении проигрывателя он включает все атрибуты TestPlayerBuildModifier для всех загруженных сборок, независимо от используемого тестового фильтра. Поскольку реализация ссылается на пространство имен UnityEditor, код обычно реализуется в сборке только редактора, поскольку пространство имен UnityEditor недоступно в ином случае.
Создание проигрывателя без запуска тестов
Можно использовать Unity Editor для построения проигрывателя с тестами, но без для запуска тестов. Это позволяет запустить проигрыватель на другой машине, например. В этом случае необходимо модифицировать проигрыватель для построения и реализации пользовательской обработки результата теста.
Вы можете использовать [TestPlayerBuildModifier], чтобы установить BuildOptions для сборки проигрывателя в определенном месте, но не запускать его. В сочетании с PostBuildCleanup, вы можете автоматически выйти из Редактора по завершении сборки. Следующий пример демонстрирует это:
using System;
using System.IO;
using System.Linq;
using Tests;
using UnityEditor;
using UnityEditor.TestTools;
using UnityEngine;
using UnityEngine.TestTools;
[assembly:TestPlayerBuildModifier(typeof(HeadlessPlayModeSetup))]
[assembly:PostBuildCleanup(typeof(HeadlessPlayModeSetup))]
namespace Tests
{
public class HeadlessPlayModeSetup : ITestPlayerBuildModifier, IPostBuildCleanup
{
private static bool s_RunningPlayerTests;
public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions)
{
// Do not launch the player after the build completes.
playerOptions.options &= ~BuildOptions.AutoRunPlayer;
// Set the headlessBuildLocation to the output directory you desire. It does not need to be inside the project.
var headlessBuildLocation = Path.GetFullPath(Path.Combine(Application.dataPath, ".//..//PlayModeTestPlayer"));
var fileName = Path.GetFileName(playerOptions.locationPathName);
if (!string.IsNullOrEmpty(fileName))
{
headlessBuildLocation = Path.Combine(headlessBuildLocation, fileName);
}
playerOptions.locationPathName = headlessBuildLocation;
// Instruct the cleanup to exit the Editor if the run came from the command line.
// The variable is static because the cleanup is being invoked in a new instance of the class.
s_RunningPlayerTests = true;
return playerOptions;
}
public void Cleanup()
{
if (s_RunningPlayerTests && IsRunningTestsFromCommandLine())
{
// Exit the Editor on the next update, allowing for other PostBuildCleanup steps to run.
EditorApplication.update += () => { EditorApplication.Exit(0); };
}
}
private static bool IsRunningTestsFromCommandLine()
{
var commandLineArgs = Environment.GetCommandLineArgs();
return commandLineArgs.Any(value => value == "-runTests");
}
}
}
Если Редактор все еще работает после запуска тестов режима воспроизведения, Игрок пытается сообщить результаты обратно, используя PlayerConnection, который имеет ссылку на IP адрес машины Редактора, когда он был построен.
Чтобы реализовать пользовательский способ отображения результатов тестового запуска, позвольте одной из сборок в Проигрывателе включить TestRunCallback. В RunFinishedможно получить полный отчет о тесте в виде XML из результата теста NUnit, вызвав result.ToXml(true). Вы можете сохранить результат и затем сохранить его на устройстве или отправить его на другую машину по мере необходимости.