【问题标题】:How to execute all the methods sequentially in testng如何在testng中顺序执行所有方法
【发布时间】:2013-10-09 22:29:29
【问题描述】:

我的类中有很多方法,当我运行代码时,方法是随机调用的,但是在我的类中,每个方法都依赖于它的前身,即第二种方法依赖于第一种方法,第三种方法依赖于第二种方法等等。我想按顺序执行所有方法

我尝试了以下方法并测试了代码,但方法仍然是随机调用的

//using sequential
@Test(sequential = true)
public void Method1(){
}


@Test(sequential = true)
public void Method2(){
}

//using singleThreaded 
@Test(singleThreaded=true)
public void Method1(){
}


@Test(singleThreaded=true)
public void Method2(){
}

我在testng中也传递了以下参数

<test name="Test" preserve-order="true" annotations="JDK">
 <classes>
 <class name="com.test" >
 <methods>
 <include name="method1"/>
 <include name="method2"/>
 <include name="method3"/>...
 </methods>
 </class>
  </classes>

 </test>

 </suite>

当我使用 @Test(dependsOnMethod="") 对其进行测试时,不是按顺序执行方法,而是跳过了这些方法。

如何在testng中顺序执行测试?

【问题讨论】:

  • 不确定是否可以控制测试执行的顺序。
  • 只需为方法分配优先级...就是这样..:)

标签: selenium selenium-webdriver testng


【解决方案1】:

您可以使用带有侦听器的@Priority 来控制执行。请参阅此链接 - http://beust.com/weblog/2008/03/29/test-method-priorities-in-testng/

【讨论】:

    【解决方案2】:

    如果依赖的方法失败,Dependsonmethods 将使您的测试跳过。这在逻辑上是正确的,因为如果 testB 依赖于 testA,那么如果 testA 失败,那么运行 testB 就没有用了。如果您只需要在 testA 之后运行 testB 并且 testB 不依赖于 testA 的结果,那么将 alwaysrun=true 添加到您的 @test 注释中。这些被称为。软依赖。参考here

    【讨论】:

      【解决方案3】:

      这是一个糟糕的测试逻辑。作为一名经验丰富的专业软件测试工程师。我建议你立即摆脱你正在走的这条自动化道路。

      良好的测试架构要求每个方法自给自足,并且在继续之前不应依赖其他测试来完成。为什么?因为说测试 2 依赖于测试 1。说测试 1 失败..现在测试 2 将失败..最终,您将测试 1、2、3、4、5 测试失败,您甚至不知道是什么原因是。

      先生,我对您的建议是创建自给自足、可维护且简短的测试。

      这是一本很棒的读物,可以帮助您的努力: http://www.lw-tech.com/q1/ug_concepts.htm

      【讨论】:

      • 我同意测试方法应该是自给自足的和简短的。但是在某些情况下,如果第一次没有通过,第二次测试甚至是不合理的。 TestNG(海报正在使用)提供了dependsOnMethods和dependsOnGroups,它们跳过下游测试,而不是使它们失败。我相信这会让失败的测试更容易被发现,而不是更难。
      • 这个答案对于单元测试来说似乎没问题。不适用于硒测试。 Selenum 测试本质上是端到端测试,涵盖了您可能需要在各种屏幕中进行多次验证的业务工作流程。你不能把所有东西都放在一个方法里!!!
      【解决方案4】:

      如果你想以某种特定的方式运行你的所有测试方法,而不仅仅是在你的 @test 注释中添加优先级。见下文:-

      @test(priority=0)
      
      function1()
      {}
      
      @test(priority=1)
      
      function2()
      
      {}
      
      
      @test(priority=5)
      
      function3()
      
      {}
      
      @test(priority=3)
      
      function4()
      
      {}
      
      @test(priority=2)
      
      function5()
      
      {}
      

      在这种情况下,function1 先于 function2 调用,之后函数 5 将调用而不是 function3,因为优先级。

      【讨论】:

        【解决方案5】:

        尝试使用来自 TestNG 框架的dependsOnMethods 依赖项。

        【讨论】:

        • 不确定这个答案有什么问题。这是解决这个问题的正确方法。
        【解决方案6】:

        首先,您不需要sequentialsingleThreaded 参数。在套件中编写单个方法就是您所需要的。您的问题可能出在其他地方。确保您使用套件而不是类本身开始测试。

        如果您不想每次都使用套件(因为它乏味、容易出错且不灵活),这里有一些解决此问题的方法。

        1. 将依赖的方法合二为一,过度使用Reporter.log(String, boolean)。这类似于System.out.println(String),但也将字符串保存到TestNG 报告中。对于第二个参数,您总是希望传递 true - 它告诉您是否也应该将消息打印到 STDOUT。在每个步骤之前执行此操作时,仅测试输出就足以识别有问题(读取失败)的测试步骤。

          此外,在执行此操作时,您还可以使用软断言。这基本上意味着您不必仅仅因为一个可选步骤不起作用而中止和失败整个测试。您可以继续直到下一个关键点,然后或在最后中止。错误仍将被保存,您可以决定是否要将测试运行标记为失败或不稳定。

        2. 使用@Test(priority = X),其中X 是一个数字。用优先级标记所有测试方法,它们将按照优先级编号从低到高的顺序执行。这样做的好处是您可以在步骤之间放置方法,并且单个注释是独立的。然而,缺点是这不会强制任何硬依赖,而只会强制执行顺序。 IE。如果优先级=1的方法testA失败,优先级=2的方法testB仍然会被执行。

          不过,您可能可以使用侦听器解决此问题。这个还没试过。

        3. 使用@Test(dependsOnMethods = {"testA"})。请注意,这里的参数不是字符串,而是字符串列表(您的帖子中有错误)。好处是硬依赖,这意味着当 testB 依赖于 testA 时, testA 的失败会将 testB 标记为已跳过。此注释的缺点是您必须将所有方法放在一个非常严格的链中,其中每个方法都依赖于另一个方法。如果你打破这个链条,例如有多种方法不依赖任何东西或有一些方法依赖相同的方法,你会进入地狱厨房......

        不幸的是,同时使用 priority 和 dependsOnMethods 并不能达到预期的效果。使用硬依赖时,优先级通常会被忽略。

        【讨论】:

          【解决方案7】:

          根据您的注释,我假设您正在使用 TestNG。我同意这里的其他人的观点,即“顺序”不是要走的路。

          选项 1:dependOnMethods

          如果您的意图是在上游依赖失败时甚至不尝试下游方法,请尝试使用dependsOnMethods。使用此设置,如果较早的测试失败,则会跳过进一步的测试(而不是失败)。

          像这样:

          // using dependsOnMethods
          @Test
          public void method1(){
              // this one passes
          }
          
          @Test(dependsOnMethods = {"method1"})
          public void method2(){
              fail("assume this one fails");
          }
          
          @Test(dependsOnMethods = {"method1"})
          public void method3(){
              // this one runs, since it depends on method1
          }
          
          @Test(dependsOnMethods = {"method2"})
          public void method4(){
              // this one is skipped, since it depends on method2
          }
          

          选项 2:优先级

          如果您的意图是执行所有测试,无论上游测试是否通过,您都可以使用优先级。

          像这样:

          其他说明

          我完全同意 sircapsalot 的观点,即测试应该是小而独立的。如果您使用了很多依赖项,那么您的整体测试框架可能存在问题。

          也就是说,有些测试需要先运行,有些测试需要最后运行,等等。有些情况下,如果其他测试失败,则应该跳过测试。例如,如果您有测试“updateOneRecord”和“updateManyRecords”,如果其中一个不起作用,您可以在逻辑上跳过多个。

          (最后一点,您的方法名称应以小写字符开头。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-13
            • 1970-01-01
            相关资源
            最近更新 更多