Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

Настройка и демонтаж тестов

Атрибуты [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] повторяются перед переходом ко второй части теста.

Порядок выполнения обратных вызовов событий setup и teardown, при этом те, которые повторяются при перезагрузке домена, отличаются от тех, которые не повторяются.
Порядок выполнения обратных вызовов событий setup и teardown, при этом те, которые запускаются при перезагрузке домена, отличаются от тех, которые не запускаются.

Базовые и производные классы

Термин Базовая в порядке выполнения обозначает базовый класс, от которого наследуется тестовый класс. 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");
        }
    }

Дополнительные ресурсы