代码之家  ›  专栏  ›  技术社区  ›  J-Roel

NUnit Order属性不适用于Parallizable

  •  0
  • J-Roel  · 技术社区  · 6 年前

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

    Nunit v3.9.0

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

    我需要命令测试执行的原因。我正在远程EC2上运行Selenium测试,ChromeDriver挂起的地方有一个bug。 [ Bug ] [ Bug ] [ Bug ] [ Bug ]

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

    我的“入门测试”非常基础。我在他们自己的[测试夹具]中运行了其中三个

    [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();
        }
    }
    

    *司机。WaitForPageLoad()是一个扩展。

    输出: enter image description here

    但是夹具在可并行化部件下以完全随机的顺序运行,这会忽略“顺序”属性。

    我读了很多帖子。但我似乎无法正确安排我的测试。
    我尝试过:

    • [测试,命令(1)] as per the documentation
    • [类别(“yada”)] ref
    • [测试用例(TestName=“001”)]
    • v3.8中添加了[测试夹具][订单(1)]
    • 按字母顺序排列测试名称和夹具名称

    提前感谢!

    编辑: 这是一个已知问题: #2521
    有什么解决办法吗?

    编辑2: 这不是问题。阅读下面Charlie的评论。

    1 回复  |  直到 4 年前
        1
  •  3
  •   Charlie    6 年前

    这个 OrderAttribute 控制测试相对于同一级别的其他测试开始的顺序。在您的示例中,该装置将在同一命名空间中的任何其他装置之前开始运行。

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

    只有在不涉及并行性的情况下,Order特性才提供测试的完整排序。对于单线程执行,首先开始的测试必须在下一个测试开始之前完成。但对于多线程执行,这不再是事实。

    假设您有三个相同级别的测试,顺序值为1、2和3。如果有三个或三个以上的执行线程,那么这三个线程都可以启动:1、2、3!它们平行运行。

    看,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 方法