运行 使用 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