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