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

l3zydbqr  于 2022-11-29  发布在  其他
关注(0)|答案(7)|浏览(190)

我的类中有很多方法,当我运行代码时,方法是随机调用的,但在我的类中,每个方法都依赖于它的前一个方法,即第二个方法依赖于第一个方法,第三个方法依赖于第二个方法,依此类推。我想顺序执行所有方法
我已经尝试了下面的方法并测试了代码,但是这些方法仍然是随机调用的

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

44u64gxh

44u64gxh1#

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

@test(priority=0)

function1()
{}

@test(priority=1)

function2()

{}

@test(priority=5)

function3()

{}

@test(priority=3)

function4()

{}

@test(priority=2)

function5()

{}

本例中function1比function2先调用,之后function5会因为优先级而代替function3调用。

igsr9ssn

igsr9ssn2#

Dependsonmethods会在测试所依赖的方法失败时跳过测试。这在逻辑上是正确的,因为如果testB依赖于testA,那么如果testA失败,那么就没有必要运行testB。如果你只需要在testA之后运行testB,而testB并不依赖于testA的结果,那么就在@test注解中添加alwaysrun=true。这就是所谓的. Soft dependencies。请参考这里。

x6492ojm

x6492ojm3#

首先,你不需要sequentialsingleThreaded参数。你只需要在套件中编写单个方法。你的问题可能出在其他地方。确保你是使用套件而不是类本身开始测试的。
如果你不想每次都使用suites(因为它很乏味,容易出错,而且不灵活),这里有一些解决这个问题的方法。
1.将依赖的方法放入一个方法中,并过度使用Reporter.log(String, boolean)。这类似于System.out.println(String),但也将String保存到TestNG报告中。对于第二个参数,您总是希望传递true -它告诉是否还应将消息打印到STDOUT。当在每个步骤之前这样做时,测试输出本身就足以识别有问题的(读取失败的)测试步骤。
此外,在执行此操作时,您还可以使用软Assert。这基本上意味着您不必仅因为一个可选步骤不起作用而放弃整个测试。您可以继续执行,直到下一个临界点,然后在此时或结束时放弃。错误仍将被保存,您可以决定是否要将测试运行标记为失败或不稳定。
1.使用@Test(priority = X),其中X是一个数字。用一个优先级来标记你所有的测试方法,它们将按照优先级从低到高的顺序执行。这样做的好处是你可以把方法放在步骤之间,并且单个注解是独立的。但是缺点是这样做不会强制任何硬依赖,而只是顺序。也就是说,如果优先级=1的方法testA失败了,尽管如此,仍将执行优先级=2的方法testB。
不过,您可能可以使用侦听器来解决这个问题。
1.使用@Test(dependsOnMethods = {"testA"})。请注意,此处的参数不是字符串,而是字符串列表(你在文章中犯了这个错误)。优点是硬依赖,这意味着当testB依赖于testA时,testA的失败会将testB标记为跳过。这个注解的缺点是你必须将所有的方法放在一个非常严格的链中,每个方法都依赖于另一个方法。如果你破坏了这个链,例如,让多个方法不依赖于任何东西,或者让一些方法依赖于相同的方法,你会进入地狱的厨房...
不幸的是,同时使用priority和dependsOnMethods并不能达到预期的效果。

2admgd59

2admgd594#

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

wgx48brx

wgx48brx5#

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

klh5stk1

klh5stk16#

根据您的注解,我假设您使用的是TestNG。我同意这里其他人的观点,“顺序”不是一条路。

选项1:依赖于方法

如果您的意图是在上游依赖项失败时甚至不尝试下游方法,请改为尝试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”,如果一个不起作用,你可以逻辑地跳过多个。
(And最后要注意的是,您的方法名应该以小写字符开始。)

ryhaxcpt

ryhaxcpt7#

这可能不是最好的设计。我建议你尝试分散这个设计。
好的测试架构要求每个方法都是自给自足的,并且在继续之前不应该依赖于其他测试来完成。为什么?因为假设测试2依赖于测试1。假设测试1失败..现在测试2将失败..最终,您将有测试1、2、3、4、5失败,而您甚至不知道原因是什么。
我给你的建议是创建一个自给自足的,可维护的,简短的测试。
这是一个伟大的阅读,将帮助你在你的努力:http://www.lw-tech.com/q1/ug_concepts.htm

相关问题