nunit:setupfixture中的全局变量初始化

问题描述 投票:0回答:1

我对C#和nunit非常陌生。请问我这是否基本,已经在这里被问到了。

我们有一个由[SetupFixture]类定义的全局设置,该设置只能运行一次。专用变量在[设置]中定义。我们希望在所有测试夹具中使用相同的变量,从而在所有测试夹具中继承testbase类。但是,在执行Testcase1时,我观察到globalSetup()被多次调用了。谁能指出我的问题?示例代码如下。

namespace CTB
    {
         [SetupFixture] 
         public class Testbase
         {
            private byte val1;
            private byte val2;  


        [setup]
        public void globalSetup
        {
           val1 = 5;
           val2 = 10;
        }

        [Teardown]
        public void globalTeardown
        {
            //
        }
      }
}


namespace CTB.Testcase
{

    public class TestCase : Testbase
    {
        [Setup]
        public void Setup()
        {

        }

        [Teardown]
        public void Teardown()
        {

        }

        [Test]
        public void Testcase1()
        {
            byte val3 = val1 + val2; // Expect 15
        }
    }
}
nunit global
1个回答
0
投票

我假设我的评论的答案是“否”,并且您正在使用NUnit 3的当前版本。如果我错了,请更正我。 :-)

您已经使TestBase类具有两个功能:

  1. 这是您的TestFixture的基类,因此它本身是TestFixture

  2. 它被标记为SetUpFixture,因此它也具有该功能-顺便说一句完全不同的功能。

要清楚,您永远不要这样做。这似乎是一种旨在欺骗NUnit的“技巧”-当然不是您的意图。您的测试装置不应与任何SetUpFixture具有继承关系。对测试夹具基座和设置夹具使用不同的类。

顺便说一句,这是正在发生的事情的长篇故事...

  1. 甚至在执行测试之前,SetUpFixture首先“运行”-用引号引起来,因为它实际上不执行任何操作。那是因为它不包含任何标有[OneTimeSetUp]或'[OneTimeTearDown]`的方法。

注:作为替代说明,如果您使用的是NUnit的较旧版本,则此时实际上会调用[SetUp][TearDown]方法。当在SetUpFixture与TestFixture中遇到时,Nnit V2使用这些属性具有不同的含义。

  1. 接下来执行测试。在每次测试之前,都运行继承的[SetUp][TearDown]方法。当然,这些实际上与第1步中的方法相同。NUnit被欺骗这样做了!

这里是对未来的一些一般性指导...

  1. 如果您希望多个灯具使用相同的数据,则基类很有用。任何公共或受保护的字段或属性都将由继承的固定装置共享。

  2. 如果要对一组[[无关]]测试治具进行一些常见的设置或拆卸,请使用SetUpFixture。注意,将数据从SetUpFixture传递到测试治具的唯一方法是通过静态字段或属性。通常,您使用SetUpFixture设置要在其中运行测试的环境,而不是提供数据。

  3. Never

  4. 出于同一目的使用相同的类。
© www.soinside.com 2019 - 2024. All rights reserved.