运行 使用 NUnit 属性 FixtureLifeCycle 值 InstancePerTestCase 在同一 class 中并行测试 Selenium 的工作示例
Working example for running Selenium tests in parallel within the same class using NUnit attribute FixtureLifeCycle value InstancePerTestCase
从 NUnit 3.13.1 开始(我正在尝试 3.13.1)当 运行在 class 中并行测试时,引入了一个新属性用于 TestFixture 隔离。
有没有人设法在同一个 class 中并行使用 [Parallelizable(ParallelScope.All)] + [FixtureLifeCycle(LifeCycle.SingleInstance)] 和 运行 Webdriver 测试?
激活此功能后,我开始遇到不可预知的错误,就像以前没有新属性时一样。看起来 Fixture 不是孤立的。
注意:运行并行测试 WebDriver class 时一切正常。
WebDriver 初始化于
TestFixture 基础 class 如下所示
[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()
{
}
}
关于并行执行的 NUnit 属性的一般原理是它们旨在 告诉 NUnit 运行 您的 class 并行是安全的。使用它们并 安全...这取决于您。
新属性使您更容易做到这一点,但不保证任何事情。它确实可以保护您免受某种类型的错误 - 两个并行测试用例实例对测试的同一成员进行不兼容的更改 class。但这只是 运行 并行测试失败的所有方式中的一小部分。
换句话说...您的 Fixture 现在是安全的,但您的 Fixture 可能引用的内容、驱动程序、文件、远程服务都没有受到任何保护。如果您的固定装置共享任何外部的东西,那就是失败的根源。
很遗憾,您没有提供足够的信息让我指出这里的具体问题。例如,您没有显示 Driver 属性 的声明方式或位置。如果您提供更多信息,我很乐意更新我的回答。
回到我最初的观点,您对属性的使用只不过是您对 NUnit 做出的承诺...类似于“我已经确保它是运行 并行进行此测试是安全的。”在您的情况下,您做出了更大的承诺,即 您的夹具中的所有测试 对并行 运行 是安全的。那不是我开箱即用的事情。我将从两个测试开始,我认为它们可以安全地 运行 在一起,然后我会从那里扩展。显然,运行 并行进行一项测试几乎总是安全的。 :-)
代码中的错误非常明显(使用了 SingleInstance 而不是 InstancePerTestCase)
创建了一个包含 2 个 类 的模板项目,每个项目有 3 个测试。
所有 6 个都可以同时执行而不会出现任何故障。
https://github.com/andrewlaser/TestParallelNUnit
从 NUnit 3.13.1 开始(我正在尝试 3.13.1)当 运行在 class 中并行测试时,引入了一个新属性用于 TestFixture 隔离。 有没有人设法在同一个 class 中并行使用 [Parallelizable(ParallelScope.All)] + [FixtureLifeCycle(LifeCycle.SingleInstance)] 和 运行 Webdriver 测试?
激活此功能后,我开始遇到不可预知的错误,就像以前没有新属性时一样。看起来 Fixture 不是孤立的。
注意:运行并行测试 WebDriver class 时一切正常。
WebDriver 初始化于 TestFixture 基础 class 如下所示
[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()
{
}
}
关于并行执行的 NUnit 属性的一般原理是它们旨在 告诉 NUnit 运行 您的 class 并行是安全的。使用它们并 安全...这取决于您。
新属性使您更容易做到这一点,但不保证任何事情。它确实可以保护您免受某种类型的错误 - 两个并行测试用例实例对测试的同一成员进行不兼容的更改 class。但这只是 运行 并行测试失败的所有方式中的一小部分。
换句话说...您的 Fixture 现在是安全的,但您的 Fixture 可能引用的内容、驱动程序、文件、远程服务都没有受到任何保护。如果您的固定装置共享任何外部的东西,那就是失败的根源。
很遗憾,您没有提供足够的信息让我指出这里的具体问题。例如,您没有显示 Driver 属性 的声明方式或位置。如果您提供更多信息,我很乐意更新我的回答。
回到我最初的观点,您对属性的使用只不过是您对 NUnit 做出的承诺...类似于“我已经确保它是运行 并行进行此测试是安全的。”在您的情况下,您做出了更大的承诺,即 您的夹具中的所有测试 对并行 运行 是安全的。那不是我开箱即用的事情。我将从两个测试开始,我认为它们可以安全地 运行 在一起,然后我会从那里扩展。显然,运行 并行进行一项测试几乎总是安全的。 :-)
代码中的错误非常明显(使用了 SingleInstance 而不是 InstancePerTestCase)
创建了一个包含 2 个 类 的模板项目,每个项目有 3 个测试。 所有 6 个都可以同时执行而不会出现任何故障。 https://github.com/andrewlaser/TestParallelNUnit