如何在testng中按顺序执行所有方法

时间:2013-10-03 09:28:39

标签: selenium selenium-webdriver testng

我的课程中有很多方法,当我运行代码时,方法是随机调用的,但在我的类中,每个方法都依赖于它的前置者,即第二种方法依赖于第一种方法,第三种方法依赖于第二种方法我希望按顺序排除所有方法

我已经尝试了下面的方法并测试了代码,但这些方法仍被随机调用

//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中按顺序执行测试?

7 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

    此外,当您这样做时,您可以使用Soft Assertsions。这基本上意味着您不必仅因为一个可选步骤不起作用而中止并使整个测试失败。您可以继续直到下一个临界点并在当时或结束时中止。错误仍将保存,您可以决定是将测试运行标记为失败还是不稳定。

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

    你可能可以使用监听器解决这个问题。尚未尝试过。

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

  4. 同时使用优先级和dependsOnMethods并不能让你在不幸的地方得到它。使用硬依赖时,优先级被忽略。

答案 3 :(得分:0)

您可以使用@Priority和Listeners控制执行。请参阅此链接 - http://beust.com/weblog/2008/03/29/test-method-priorities-in-testng/

答案 4 :(得分:0)

这是一个糟糕的测试逻辑..作为一名经验丰富的专业软件测试工程师。我建议您立即从您所在的自动化路径中分散。

良好的测试架构要求每种方法都 SELF-SUFFICIENT ,并且在继续之前不应依赖其他测试来完成。为什么?因为说测试2取决于测试1.说测试1失败..现在测试2将失败..最终,你将测试1,2,3,4,5测试失败,你甚至不知道什么原因是。

我向你提出的建议是创建自给自足,可维护和短测试。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我根据您的注释假设您正在使用TestNG。我在这里同意其他人的观点&#39;顺序&#39;不是要走的路。

选项1:dependsOnMethods

如果您的意图是在上游依赖项失败时甚至未尝试下游方法,请尝试使用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,测试应该是小而自足的。如果您使用了大量依赖项,那么您的整体测试框架可能会出现问题。

也就是说,有些测试需要先运行,其他需要最后运行,等等。如果其他测试失败,有些情况下应该跳过测试。例如,如果您有测试&#34; updateOneRecord&#34;和&#34; updateManyRecords&#34;,如果一个人没有工作,你可以在逻辑上跳过多个。

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