NUnit-使用OneTimeSetup和参数化TestFixture?

时间:2019-02-26 20:11:18

标签: nunit

我正在尝试编写使用参数化TestFixtures的Nunit测试,但每个执行(显然每个参数)仅调用一次OneTimeSetup(和OneTimeTearDown)。我将测试放在不同的类中,但是OneTimeSetupOneTimeTearDown在每个EACH 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)
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

我能够通过使用静态变量和仅具有SetUpFixture属性的OneTimeTearDown的组合来解决此问题。希望这对其他人有帮助。我试图编写硒测试,所以我还将包括我的解决方案。

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 {     公共类TestClassTwo:TestFixtureSetup     {         公共TestClassTwo(字符串浏览器):             基本(浏览器)         {}

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

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

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

}