NUnit - 使用 OneTimeSetup 和参数化 TestFixture?
NUnit - Using OneTimeSetup And Parameterized TestFixture?
我正在尝试编写使用参数化 TestFixtures 的 Nunit 测试,但在整个执行过程中(显然是每个参数)只调用一次 OneTimeSetup
(和 OneTimeTearDown
)。我在单独的 类 中进行测试,但是 OneTimeSetup
和 OneTimeTearDown
在每个 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");
}
}
}
我正在尝试编写使用参数化 TestFixtures 的 Nunit 测试,但在整个执行过程中(显然是每个参数)只调用一次 OneTimeSetup
(和 OneTimeTearDown
)。我在单独的 类 中进行测试,但是 OneTimeSetup
和 OneTimeTearDown
在每个 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");
}
}
}