Version: 6000.3
语言: 中文
在测试前后执行作
在安装前或拆卸后执行作

设置和拆卸测试

[UnitySetUp][UnityTearDown]属性等同于 NUnit[SetUp][TearDown]属性,但它们允许为 Unity 编辑器提供指令。这[UnitySetUp][UnityTearDown]属性需要返回类型 IEnumerator

[UnityOneTimeSetUp][UnityOneTimeTearDown]属性等同于 NUnit[OneTimeSetUp][OneTimeTearDown]属性,但它们允许为 Unity 编辑器提供指令。这[UnityOneTimeSetUp][UnityOneTimeTearDown]属性需要返回类型 IEnumerator

有关更多信息和使用示例,请参阅相应的 API 参考[UnitySetUp],[UnityTearDown],[UnityOneTimeSetUp][UnityOneTimeTearDown].

执行顺序

[UnitySetUp][UnityTearDown]可以与[Test][UnityTest]test 属性。在这两种情况下,Unity 和非 Unity 的相对执行顺序[SetUp][TearDown]属性是相同的。唯一的区别是[UnityTest]允许在测试期间产生可能导致域重新加载的指令,在这种情况下,非 Unity[SetUp]在继续测试的第二部分之前重新运行方法。

设置和拆卸事件回调的执行顺序,在域重新加载时重新运行的回调与不重新运行的回调不同。
设置和拆卸事件回调的执行顺序,在域重新加载时重新运行的回调与不重新运行的回调不同。

基类和派生类

执行顺序中的术语 base 表示测试类从中继承的基类。UnitySetUpUnityTearDown遵循与 NUnit 相同的模式SetUpTearDown属性来确定基类及其派生项之间的执行顺序。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作(例如OneTimeSetupSetup) 重新运行,然后启动域重新加载的代码继续。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");
        }
    }

其他资源

在测试前后执行作
在安装前或拆卸后执行作