使用NUnit属性FixtureLifeCycle值InstancePerTestCase在同一个类中并行运行Selen



从NUnit 3.13.1开始(我正在尝试3.13.1),在类内并行运行测试时,为TestFixture隔离引入了一个新属性。有没有人设法使用[parallelelizable (ParallelScope.All)] + [FixtureLifeCycle(lifeccycle . singleinstance)]并在同一类中并行运行Webdriver测试?

激活此特性后,我开始得到不可预测的错误,就像我过去没有新属性时一样。看起来Fixture没有被隔离。

注意:在并行运行WebDriver测试类时一切正常。

WebDriver在TestFixture基类如下所示

[SetUp]
protected void Initialize()
{
//InitializeWebDriver();
Driver = new MyDriver();
}
[TearDown]
public void TestFixtureTearDown()
{
try
{
//...
}
finally
{
Driver.Quit();
Driver = null;

}
}
}

测试如下:

[TestFixture]
[Parallelizable(ParallelScope.All)]
[FixtureLifeCycle(LifeCycle.SingleInstance)]
public class TestClassA : TestBase
{
[Test]
public void TestA1()
{
}
}

代码中的错误非常明显(使用了SingleInstance而不是InstancePerTestCase)

创建一个包含2个类的模板项目,每个类有3个测试。所有6个可以同时执行而不出现任何故障。https://github.com/andrewlaser/TestParallelNUnit

关于并行执行的NUnit属性的一般原理是,它们旨在告诉NUnit并行运行类是安全的。使用它们不会使生成它安全…这取决于你。

新属性使您更容易做到这一点,但不能保证任何事情。它确实可以保护您免受某种类型的错误——两个并行的测试用例实例对测试类的同一成员进行不兼容的更改。但这只是并行运行时测试失败的一小部分原因。

换句话说……你的夹具现在是安全的,但是你的Fixture可能引用的东西,驱动程序,文件,远程服务是不受保护的。如果您的fixture共享外部的任何东西,这就是故障的根源。

不幸的是,你没有给我足够的信息来指出这里的具体问题。例如,您没有说明如何或在哪里声明Driver属性。如果你有更多的信息,我很乐意更新我的回答。

回到我最初的观点,你对属性的使用只不过是一个承诺你正在向NUnit…比如"我已经确保并行运行这个测试是安全的。"在您的例子中,您做出了更大的承诺,所有的测试在你的夹具是安全的运行并行。我不会马上就这么做的。我将从两个测试开始,我认为它们可以安全地一起运行,然后从那里扩展。显然,并行运行一个测试几乎总是安全的。: -)

最新更新