【问题标题】:NUnit Order Attribute does not work with ParallizableNUnit 订单属性不适用于 Parallizable
【发布时间】:2018-03-02 19:16:57
【问题描述】:

如何在使用订单属性时利用可并行化测试?

Nunit v3.9.0

我意识到与此主题相关的其他帖子的数量...但是使用 ParallelScope.Self 时似乎没有排序。

我需要订购测试执行的原因。我在远程 EC2 上运行 Selenium 测试,ChromeDriver 有一个挂起的错误。 [Bug] [Bug] [Bug] [Bug]

我需要运行一些可能会静默失败的初始测试,以确保 ChromeDriver 正常运行...然后我需要并行运行其余的测试。self 以利用速度。

我的“初始测试”非常基础。我在自己的 [TestFixture]

中运行其中的三个
[TestFixture]
[Order(1)]
public class Initiate
{
    [TestCase(TestName = "001")]
    public void Initiate_ChromeDriver_2()
    {
        try
        {
            IWebDriver driver = new ChromeDriver();
            driver.Navigate().GoToUrl(<url>);
            driver.WaitForPageLoad();
            driver.Quit();
            driver.Dispose();
        }
        catch (Exception ex)
        {
            Assert.Inconclusive(ex.Message);
        }
        Assert.Pass();
    }
}

*driver.WaitForPageLoad() 是一个扩展。

输出:

但是...在 Parallelizable 程序集下,固定装置以完全随机的顺序运行,忽略了 order 属性。

我已经阅读了很多帖子。但我似乎无法让我的测试正确排序。
我试过了:

  • [测试,订单(1)]as per the documentation
  • [类别("yada")] ref
  • [TestCase(TestName = "001")]
  • [TestFixture][Order(1)] 在 v3.8 中添加
  • 按字母顺序排列测试名称和夹具名称

提前致谢!

编辑: 这是一个已知问题: #2521
任何解决方法?

编辑 2: 不是问题。阅读下面查理的 cmets。

【问题讨论】:

  • 请注意,问题 2521 尚未确认,等待提交者的重现案例。因此,没有人知道这是否真的是一个问题,也没有人正在解决它。 :-(

标签: nunit selenium-chromedriver


【解决方案1】:

OrderAttribute 控制测试的启动顺序 WRT 相同级别的其他测试。在您的示例中,夹具将在同一命名空间中的任何其他夹具之前开始运行。

当然,夹具上的属性不会影响夹具内测试用例的运行方式。

只有在不涉及并行性的情况下,Order 功能才会对测试进行完整排序。对于单线程执行,首先开始的测试必须在下一个测试开始之前完成。但在多线程执行的情况下,情况就不再如此了。

假设您在同一级别有三个测试,顺序值为 1、2 和 3。如果有三个或更多执行线程,则所有三个都可能开始:1、2、3!它们并行运行。

IOW,NUnit 提供的简单排序不是依赖。也就是说,不能保证 Order 1 的测试会在下一个测试运行之前完成。如果您愿意,这是一个请求的功能,但尚未实现。

OTOH,看起来您并不是真的想要测试订购。您正在尝试做的事情在我看来像是一次性设置方法的工作,而不是测试。事实上,设置、测试和拆卸之间的依赖关系是目前 NUnit 中存在的唯一依赖关系,因此您应该尝试按照设置模型的方式制定依赖关系要求。

在你的情况下,我相信你想要一个 SetUpFixture 或者可能几个。固定装置可以放置在所有命名空间之外,以便为您提供在程序集中的任何其他东西之前运行的东西,或者如果需要它的测试都在一个命名空间中,则可以在特定命名空间中运行。它可能看起来像这样:

[SetUpFixture]
public class Initiate
{
  [OneTimeSetUp]
  public void Initiate_ChromeDriver_2()
  {
        IWebDriver driver = new ChromeDriver();
        driver.Navigate().GoToUrl(<url>);
        driver.WaitForPageLoad();
        driver.Quit();
        driver.Dispose();
  }
}

我留下了你所有的代码,虽然我不确定我是否理解你为什么要关闭和处置驱动程序。你的测试不需要它吗?可以将处理移至OneTimeTearDown 方法。

【讨论】:

  • 一如既往,非常感谢您这么快回答我的 NUnit 问题。 SetUpFixture 会很好用!
  • 经过进一步调查,我发现导致我的问题的 DNS 服务器错误。有几个线程1,当然我找不到我想的那个。但是,关于这个与 selenium 相关的问题:ChromeDriver 调用 googleapis 端点。不知道为什么需要这样做。您可以通过在主机文件中返回虚假 IP 来关闭它。或者您可以简单地刷新您的 ChromeDriver(c# 中的 driver.Navigate().Refresh())。
  • 我设置了一种蛮力页面等待扩展。如果挂起超过 10 秒,它将检查页面加载。然后它刷新页面并再次检查。它最多重复四次。然后我按照查理的指示从 [SetUpFixture] 调用它。效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多