Настройка и демонтаж тестов
Атрибуты [UnitySetUp] и [UnityTearDown] эквивалентны атрибутам NUnit [SetUp] и [TearDown], за исключением того, что они позволяют выдавать инструкции для Unity Editor. Атрибуты [UnitySetUp] и [UnityTearDown] ожидают тип возврата IEnumerator.
Атрибуты [UnityOneTimeSetUp] и [UnityOneTimeTearDown] эквивалентны атрибутам NUnit [OneTimeSetUp] и [OneTimeTearDown], за исключением того, что они позволяют выдавать инструкции для Unity Editor. Атрибуты [UnityOneTimeSetUp] и [UnityOneTimeTearDown] ожидают тип возврата IEnumerator.
Для получения дополнительной информации и примеров использования см. соответствующие ссылки API для [UnitySetUp], [UnityTearDown], [UnityOneTimeSetUp]и [UnityOneTimeTearDown].
Ордер на исполнение
[UnitySetUp] и [UnityTearDown] могут быть использованы с атрибутами теста [Test] или [UnityTest]. В обоих случаях порядок выполнения Unity и не-Unity атрибутов [SetUp] и [TearDown] одинаков. Единственное различие заключается в том, что [UnityTest] позволяет во время теста выдавать инструкции, которые могут привести к перезагрузке домена, в этом случае методы не-Unity и [SetUp] повторяются перед переходом ко второй части теста.
Базовые и производные классы
Термин Базовая в порядке выполнения обозначает базовый класс, от которого наследуется тестовый класс. UnitySetUp и UnityTearDown следуйте той же схеме, что и NUnit SetUp и TearDown атрибуты при определении порядка выполнения между базовыми классами и их производными. SetUp методы вызываются сначала на базовых классах, а затем на производных классах. TearDown методы вызываются сначала у производных классов, а затем у базового. Подробнее см. NUnit Документация.
Следующий пример показывает базовый и производный классы. Порядок выполнения можно проверить по порядку сообщений, выведенных в консоль:
public class BaseClass
{
[OneTimeSetUp]
public void OneTimeSetUp()
{
Debug.Log("OneTimeSetUp Base");
}
[SetUp]
public void SetUp()
{
Debug.Log("SetUp Base");
}
[UnitySetUp]
public IEnumerator UnitySetUp()
{
Debug.Log("UnitySetup Base");
yield return null;
}
[TearDown]
public void TearDown()
{
Debug.Log("TearDown Base");
}
[UnityTearDown]
public IEnumerator UnityTearDown()
{
Debug.Log("UnityTearDown Base");
yield return null;
}
}
public class DerivedClass: BaseClass
{
[OneTimeSetUp]
public new void OneTimeSetUp()
{
Debug.Log("OneTimeSetUp");
}
[SetUp]
public new void SetUp()
{
Debug.Log("SetUp");
}
[UnitySetUp]
public new IEnumerator UnitySetUp()
{
Debug.Log("UnitySetup");
yield return null;
}
[Test]
public void UnitTest()
{
Debug.Log("Test");
}
[UnityTest]
public IEnumerator UnityTest()
{
Debug.Log("UnityTest before yield");
yield return null;
Debug.Log("UnityTest after yield");
}
[TearDown]
public new void TearDown()
{
Debug.Log("TearDown");
}
[UnityTearDown]
public new IEnumerator UnityTearDown()
{
Debug.Log("UnityTearDown");
yield return null;
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
Debug.Log("OneTimeTearDown");
}
}
Перезагрузка домена
Тесты в режиме редактирования могут привести к инструкциям, которые приводят к перезагрузке домена. При перезагрузке домена все действия, не относящиеся к Unity (такие как OneTimeSetup и Setup), повторяются до того, как код, инициировавший перезагрузку домена, продолжает выполняться. Действия Unity (такие как UnitySetup) не повторяются. Если действие Unity является кодом, инициировавшим перезагрузку домена, то остальная часть кода в методе UnitySetup выполняется после перезагрузки домена.
Следующий пример демонстрирует базовые и производные классы с перезагрузкой домена:
public class BaseClass
{
[OneTimeSetUp]
public void OneTimeSetUp()
{
Debug.Log("OneTimeSetUp Base");
}
[SetUp]
public void SetUp()
{
Debug.Log("SetUp Base");
}
[UnitySetUp]
public IEnumerator UnitySetUp()
{
Debug.Log("UnitySetup Base");
yield return null;
}
[TearDown]
public void TearDown()
{
Debug.Log("TearDown Base");
}
[UnityTearDown]
public IEnumerator UnityTearDown()
{
Debug.Log("UnityTearDown Base");
yield return null;
}
}
public class DerivedClass: BaseClass
{
[OneTimeSetUp]
public new void OneTimeSetUp()
{
Debug.Log("OneTimeSetUp");
}
[SetUp]
public new void SetUp()
{
Debug.Log("SetUp");
}
[UnitySetUp]
public new IEnumerator UnitySetUp()
{
Debug.Log("UnitySetup");
yield return null;
}
[Test]
public void UnitTest()
{
Debug.Log("Test");
}
[UnityTest]
public IEnumerator UnityTest()
{
Debug.Log("UnityTest before yield");
yield return new EnterPlayMode();
//Domain reload happening
yield return new ExitPlayMode();
Debug.Log("UnityTest after yield");
}
[TearDown]
public new void TearDown()
{
Debug.Log("TearDown");
}
[UnityTearDown]
public new IEnumerator UnityTearDown()
{
Debug.Log("UnityTearDown");
yield return null;
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
Debug.Log("OneTimeTearDown");
}
}