NUnit Order Attribute不适用于Parallizable

时间:2018-03-02 19:16:58

标签: nunit selenium-chromedriver

如何在使用订单属性时利用Parallelizable测试?

Nunit v3.9.0

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

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

我需要运行一些初始测试,这些测试可以无声地失败,以确保ChromeDriver正常运行...然后我需要其余的测试并行运行。自己利用速度。

我的“启动测试”非常基础。我在他们自己的[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()是一个扩展名。

输出: enter image description here

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

我读了这么多帖子。但我似乎无法让我的测试正确订购。
我试过了:

  • [测试,订单(1)] as per the documentation
  • [Catagory(“yada”)] ref
  • [TestCase(TestName =“001”)]
  • [TestFixture] [Order(1)] in v3.8
  • 按字母顺序排列测试名称和灯具名称


提前致谢!

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

编辑2:不是问题。阅读查理的评论如下。

1 个答案:

答案 0 :(得分:2)

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

当然,夹具上的属性对夹具中的测试用例的运行没有影响。

订单功能仅在不涉及并行性时才提供测试的完整排序。使用单个执行线程,首先启动的测试必须在下一个启动之前完成。但是对于多个执行线程,这已不再适用。

假设您在同一级别进行了三次测试,订单值为1,2和3.如果有三个或更多执行线程,则三个可以开始:1,2,3!它们并行运行。

IOW,NUnit提供的简单排序是依赖。也就是说,无法保证在下一次测试运行之前,订单1的测试将完成。如果你想要它,它是一个请求的功能,但尚未实现。

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

在你的情况下,我相信你想要一个SetUpFixture或几个。如果需要它的测试都在一个命名空间中,那么可以将fixture放置在所有命名空间之外,以便在程序集中的任何其他位置或特定命名空间中运行。它可能看起来像这样:

[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方法。