【问题标题】:Selenium C# / NUnit 3.12.0 is not running tests in parallelSelenium C#/NUnit 3.12.0 没有并行运行测试
【发布时间】:2020-05-09 13:34:52
【问题描述】:

我正在 Visual Studio Enterprise 2019 版本 16.3.9/测试资源管理器窗口中执行我的测试。我的架构是 Intel(R) Core(TM) i7-7600 CPU @ 2.80Ghz(4 个 CPU),~2.9Ghz
下面是我的伪 Selenium C# 代码:

[TestFixture]
internal class TestClass{

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
       initializeExtentReport()
    }

    [SetUp]
    public void Setup()
    {
       initializeChromebBrowser();
    }

    [Test]
    public void NavigatoToGmail()
    {
        bool isGmailAccessible = GoToUrl("https://www.google.com/");
        Assert.True(isGmailAccessible);
    }

    [Test]
    public void NavigatoToMicrosoft()
    {
        bool isMicrosoftAccessible = GoToUrl("https://www.microsoft.com/");
        Assert.True(isMicrosoftAccessible);
    }


    [Test]
    public void NavigatoToYahoo()
    {
        bool isYahooAccessible = GoToUrl("https://www.yahoo.com/");
        Assert.True(isYahooAccessible);
    }

    [TearDown]
    public void TearDOwn()
    {
        CloseBrowser();
    }

    [OneTimeTearDown]
    public void OneTimeTearDown()
    {
        FinishExtentReport();
    }

所以这是我已经尝试过的,但没有成功

  1. [Parallelizable(ParallelScope.Children)] 添加到类,并将[Parallelizable(ParallelScope.Self)] 属性添加到每个测试方法。结果 - 3 个浏览器实例在没有其他操作的情况下打开。没有 URL 导航,什么都没有。

  2. 在类中添加[Parallelizable(ParallelScope.All)],在每个测试方法中添加[Parallelizable(ParallelScope.Self)]。结果 - 打开了 3 个浏览器实例。仅执行最后一个测试 (NavigatoToYahoo) 并提供结果。前 2 - 没有其他操作发生并且浏览器窗口没有关闭,这意味着 TearDown() 方法没有执行。

  3. 只需将[Parallelizable(ParallelScope.Self)] 添加到每个测试方法。结果 - 3 个浏览器实例在没有其他操作的情况下打开。没有 URL 导航,什么都没有。

  4. [Parallelizable(ParallelScope.Self)] 添加到类,并将[Parallelizable(ParallelScope.Self)] 属性添加到每个测试方法。结果 - 打开了 3 个浏览器实例。第二个测试(NavigateToMicrosoft)被执行,剩下的 2 个 - 没有其他操作,没有 URL 导航,什么都没有。

  5. [Parallelizable(ParallelScope.Self)] 添加到类,并将[Parallelizable(ParallelScope.All)] 属性添加到每个测试方法。结果 - 收到错误消息 May not specify ParallelScope.Children on a non-parameterized test method - 老实说不知道为什么

我已经阅读了https://github.com/nunit/docs/wiki/Parallelizable-Attribute 此处的文档,但我觉得没有实际的方法可以使用 NUnit 框架并行执行单元测试。

我只是想彼此独立地并行运行这 3 个测试(在我的实际场景中大约有 100 个)。

【问题讨论】:

    标签: c# unit-testing parallel-processing nunit


    【解决方案1】:

    @Neil 的回答是错误的。 NUnit 将根据您指定的方式并行运行程序集中的测试。但是,您在这里处理两个软件,每个软件都有自己的并行化方式。我可以回答 WRT NUnit,这样至少你不会浪费时间不必要地玩属性。

    1. [Parallelizable] 与 `[Parallelizable(ParallelScope.Self)] 相同。最好的风格,IMO,是在没有属性的情况下使用它,但两者是相等的。

    2. [ParallelScope.All][ParallelScope.Self | ParallelScope.Children] 的缩写。

    3. 因此,您只需要担心两个设置:Self(隐式或显式)和 Children。

    4. Children 放在一个类上与将Self 放在每个测试用例上是一样的。在这两种情况下,测试都可以相互并行运行。

    5. 当放置在一个夹具类上时,Self 表示该夹具可以与其他同样具有Self 的夹具并行运行。如果该夹具中的测试也是可并行的,那么它们将与所有并行夹具中的所有测试并行运行。

    6. 1234563 /p>
    7. 如果您有多个夹具并且您希望它们并行运行,则无需执行更多操作。如果您确实希望它们和它们的所有测试并行运行,那么请将 [Parallelizable] 也放在夹具上,或者将 [Parallelizabel(ParallelScope.All)] 放在夹具上,而不要在测试用例上。

    8. 许多人似乎错过了一些重要的事情:[Parallelizable] 使您的测试并行运行。它不会使它们能够并行运行。你必须这样做。该属性告诉 NUnit 你已经确保测试可以并行运行,所以它以这种方式运行。

    NUnit 就是这样。现在,如果您将 Selenium 添加到混合物中,则取决于您如何使用它。如果 Selenium 正在为您启动进程,那么您在 NUnit 中所做的事情不会产生任何影响。您需要了解 Selenium 并行化如何与 NUnit 交互。我只是告诉你 NUnit 是做什么的。

    观察...除非您的测试用例很少或单独花费很长时间,否则您可能会获得相同或更好的性能并行运行夹具并让测试在夹具内按顺序运行。

    更新 - 在您的后续评论中,您说您只有一个灯具。我的回答是处理一个更复杂的假设。对于一个夹具,如果您希望所有测试并行运行,请在夹具上使用 ParallelScope.Children。如果一两个测试不能并行工作,则将它们标记为 NonParallelizable。

    【讨论】:

    • 谢谢。我只有一个 [TestFixture](类)和 100 多个 [Test] 方法。也许这是一个糟糕的设计,我不知道。所以你的答案几乎是 - NUnit 没有并行运行测试,它只是标记可以以这种方式运行的方法。
    • 我不确定你从哪里得出这个结论。 NUnit 将明确如上所述并行运行您的测试。 是标记它们的人,因此 NUnit 知道它们可以并行运行。
    • 好吧,这就是我真正感到困惑的地方。 NUnit 如何并行运行我的测试?在我的问题中,我认为我提供了用属性标记类/方法的方式,而这些步骤没有帮助。我从这里得到的唯一结果是,不可能并行运行位于同一类中的测试。
    • 感谢查理的反馈。我已将 [TestFuxture] 类标记为 [Parallelizabel(ParallelScope.Children)] 并在其中运行所有测试。似乎测试正在运行,但我在 [TearDown] 上收到无效的 id selenium 错误。调试它看看有什么问题。
    • 当然...正如我最初所说的,“我可以回答 NUnit” 如果您使用 Selenium 来触发 NUnit 的多个副本,那么这是其他一切之上的另一层。不幸的是,我不知道 Selenium 是如何做到这一点的。
    【解决方案2】:

    如果单元测试在同一个类中,它们将不会并行运行。如果你有 3 个单独的测试类,它应该可以工作。

    【讨论】:

    • 真的吗?文档中的任何地方都没有说我将无法并行运行测试。如果我不能并行运行测试,这将是糟糕的设计
    • 这不是 NUnit,而是整个 Visual Studio 测试框架。在许多方面,它是一个很好的设计选择,因为通常在同一个测试类中测试同一个对象。我相信如果您将测试分成不同的类,您的方案会起作用。
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2017-05-25
    • 1970-01-01
    • 2016-10-24
    • 2014-01-03
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多