【问题标题】:NUnit - Using OneTimeSetup And Parameterized TestFixture?NUnit - 使用 OneTimeSetup 和参数化的 TestFixture?
【发布时间】:2019-03-02 01:37:33
【问题描述】:

我正在尝试编写使用参数化 TestFixtures 的 Nunit 测试,但在整个执行过程中(显然是每个参数)只调用一次 OneTimeSetup(和 OneTimeTearDown)。我在单独的类中进行了测试,但是 OneTimeSetupOneTimeTearDown 在每个 TestClass 之前执行一次。所以,第一个参数的调试语句是这样的:

OneTimeSetUp: parameter: param1
TestClassOneTestOne
TestClassOneTestTwo
OneTimeTearDown: parameter: param1
OneTimeSetUp: parameter: param1
TestClassTwoTestOne
TestClassTwoTestTwo
OneTimeTearDown: parameter: param1

但我想要的是这个:

OneTimeSetUp: parameter: param1
TestClassOneTestOne
TestClassOneTestTwo
TestClassTwoTestOne
TestClassTwoTestTwo
OneTimeTearDown: parameter: param1

认为我可以通过在每个测试类上复制每个测试装置来实现我想要的,但是我将运行 很多 不同的测试,我只想一次定义多个参数。此外,如果我将 OneTimeSetUp 和 OneTimeTearDown 放在完全不同的命名空间中(例如 this),我将无法访问 TestCaseSetup 中的任何全局变量(例如 webdriver 实例)来初始化浏览器。

这是我的代码:

TestCaseSetup.cs

namespace NunitTests
{
    [TestFixture("param1")]
    [TestFixture("param2")]
    public class TestCaseSetup
    {
        private readonly string _param;

        public TestCaseSetup(string param)
        {
            _param = param;
        }

        [OneTimeSetUp]
        public void OneTimeSetUp()
        {
            Debug.WriteLine("OneTimeSetUp: parameter: " + _param)
        }

        [OneTimeTearDown]
        public void OneTimeTearDown()
        {
            Debug.WriteLine("OneTimeTearDown: parameter: " + _param)
        }
    }
}

测试/TestClassOne.cs

namespace NunitTests.Tests
{
    public class TestClassOne : TestCaseSetup
    {
        public TestClassOne(string param) :
            base(param, param)
        { }

        [Test]
        public void TestClassOneTestOne()
        {
            Debug.WriteLine("TestClassOneTestOne");
        }

        [Test]
        public void TestClassOneTestTwo()
        {
            Debug.WriteLine("TestClassOneTestTwo");
        }
    }
}

测试/TestClassTwo.cs

namespace NunitTests.Tests
{
    public class TestClassTwo : TestCaseSetup
    {
        public TestClassTwo(string param) :
            base(param, param)
        { }

        [Test]
        public void TestClassTwoTestOne()
        {
            Debug.WriteLine("TestClassTwoTestOne");
        }

        [Test]
        public void TestClassTwoTestTwo()
        {
            Debug.WriteLine("TestClassTwoTestTwo");
        }
    }
}

【问题讨论】:

    标签: nunit


    【解决方案1】:

    我能够通过结合使用静态变量和仅具有 OneTimeTearDown 属性的 SetUpFixture 来解决此问题。希望这对其他人有帮助。我正在尝试编写硒测试,因此我也将包含我的解决方案。

    TestFixtureSetup.cs

    namespace NunitTests
    {
        [TestFixture("chrome")]
        [TestFixture("firefox")]
        public class TestFixtureSetup
        {
            public static IWebDriver Driver;
            public static string Browser;
    
            public TestFixtureSetup(string browser)
            {
                Browser = browser;
            }
    
            public void SetUpDriver()
            {
                if (Driver != null) return; // Exit method every time except for the first.
    
                var caps = new DesiredCapabilities();
                caps.SetCapability(CapabilityType.BrowserName, Browser);
                Driver = new RemoteWebDriver(new Uri("http://ondemand.saucelabs.com:80/wd/hub"),  // Saucelabs URI.  FYI. 
                    caps, TimeSpan.FromSeconds(600));
            }
        }
    }
    

    TestFixtureTearDown.cs

    namespace NunitTests
    {
        [SetUpFixture]
        public class TestFixtureTearDown
        {
            [OneTimeTearDown]
            public void TearDownDriver()
            {
                // Note that I am calling the static instance of the TestFixtureSetup variables
                if (TestFixtureSetup.Driver == null) return;
    
                Debug.WriteLine("Browser: " + TestFixtureSetup.Browser);
    
                TestFixtureSetup.Driver.Dispose();
            }
        }
    }
    

    测试/TestClassOne.cs

    namespace NunitTests.Tests
    {
        public class TestClassOne : TestFixtureSetup
        {
            public TestClassOne(string browser) :
                base(browser)
            { }
    
            [OneTimeSetUp]
            public void OneTimeSetUp()
            {
                SetUpDriver()
            }
    
            [Test]
            public void TestClassOneTestOne()
            {
                Debug.WriteLine("TestClassOneTestOne");
            }
    
            [Test]
            public void TestClassOneTestTwo()
            {
                Debug.WriteLine("TestClassOneTestTwo");
            }
        }
    }
    

    测试/TestClassTwo.cs

    命名空间 NunitTests.Tests { 公共类TestClassTwo:TestFixtureSetup { 公共TestClassTwo(字符串浏览器): 基础(浏览器) { }

        [OneTimeSetUp]
        public void OneTimeSetUp()
        {
            SetUpDriver()
        }
    
        [Test]
        public void TestClassTwoTestOne()
        {
            Debug.WriteLine("TestClassTwoTestOne");
        }
    
        [Test]
        public void TestClassTwoTestTwo()
        {
            Debug.WriteLine("TestClassTwoTestTwo");
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多