NUnit-使用OneTimeSetup和参数化TestFixture?

NUnit-使用OneTimeSetup和参数化TestFixture?,nunit,Nunit,我试图编写Nunit测试,使用参数化测试装置,但在整个执行过程中(显然是每个参数)只调用OneTimeSetup(和onetimeeardown)一次。我在不同的类中进行测试,但是在每个测试类之前执行一次OneTimeSetup和onetimeeardown。因此,第一个参数的调试语句如下所示: OneTimeSetUp: parameter: param1 TestClassOneTestOne TestClassOneTestTwo OneTimeTearDown: parameter: p

我试图编写Nunit测试,使用参数化测试装置,但在整个执行过程中(显然是每个参数)只调用
OneTimeSetup
(和
onetimeeardown
)一次。我在不同的类中进行测试,但是在每个测试类之前执行一次
OneTimeSetup
onetimeeardown
。因此,第一个参数的调试语句如下所示:

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和onetimeeardown放在完全不同的名称空间(如)中,我将无法访问
testcasestup
中的任何全局变量(如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");
        }
    }
}
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

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

我能够通过使用静态变量和一个
SetUpFixture
的组合来解决这个问题,这个
SetUpFixture只有一个
onetimeeardown
属性。希望这能帮助其他人。我试图编写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 : TestCaseSetup
    {
        public TestClassOne(string param) :
            base(param, param)
        { }

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

        [Test]
        public void TestClassOneTestTwo()
        {
            Debug.WriteLine("TestClassOneTestTwo");
        }
    }
}
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

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");
        }
    }
}
名称空间nunitests.Tests { 公共类TestClass2:TestFixtureSetup { 公共TestClass2(字符串浏览器): 基本(浏览器) {}

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

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

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