NUnit - 使用 OneTimeSetup 和参数化 TestFixture?

NUnit - Using OneTimeSetup And Parameterized TestFixture?

我正在尝试编写使用参数化 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

认为我可以通过在每个测试中复制每个测试装置来实现我想要的类,但我会运行lots 不同的测试,我只想定义一次多个参数。此外,如果我将 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)
        }
    }
}

Tests/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");
        }
    }
}

Tests/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");
        }
    }
}

我能够通过结合使用静态变量和只有 OneTimeTearDown 属性的 SetUpFixture 来解决这个问题。希望这对其他人有帮助。我正在尝试编写 selenium 测试,所以我也会包括我的解决方案。

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();
        }
    }
}

Tests/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");
        }
    }
}

Tests/TestClassTwo.cs

命名空间NunitTests.Tests { public class 测试类二:测试夹具设置 { public TestClassTwo(字符串浏览器): 基地(浏览器) { }

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        SetUpDriver()
    }

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

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

}