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