Selenium 如何在testng中顺序执行所有方法
我的类中有很多方法,当我运行代码时,方法是随机调用的,但在我的类中,每个方法都依赖于它的前置构造函数,即第二个方法依赖于第一个方法,第三个方法依赖于第二个方法,依此类推。我想按顺序执行所有方法 我已经尝试了下面的方法并测试了代码,但是这些方法仍然是随机调用的Selenium 如何在testng中顺序执行所有方法,selenium,selenium-webdriver,testng,Selenium,Selenium Webdriver,Testng,我的类中有很多方法,当我运行代码时,方法是随机调用的,但在我的类中,每个方法都依赖于它的前置构造函数,即第二个方法依赖于第一个方法,第三个方法依赖于第二个方法,依此类推。我想按顺序执行所有方法 我已经尝试了下面的方法并测试了代码,但是这些方法仍然是随机调用的 //using sequential @Test(sequential = true) public void Method1(){ } @Test(sequential = true) public void Method2(){ }
//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中顺序执行测试?您可以使用@Priority with Listeners来控制执行。请参阅此链接-dependson如果所依赖的方法失败,则方法将使您的测试被跳过。这在逻辑上是正确的,因为如果testB依赖于testA,那么如果testA失败,那么就没有必要运行testB。如果您只需要在testA之后运行testB,并且testB不依赖于testA的结果,那么在@test注释中添加一个alwaysrun=true。这些被称为。软依赖性。请参阅。这是糟糕的测试逻辑。。作为一名经验丰富的专业软件测试工程师。。我建议您立即离开您所处的自动化路径 良好的测试体系结构要求每个方法都是自给自足的,并且在继续之前不应依赖于其他测试来完成。为什么?因为假设测试2取决于测试1。假设测试1失败。。现在测试2将失败。。最终,您将有测试1、2、3、4、5失败,而您甚至不知道原因是什么 先生,我建议您创建自给自足、可维护和简短的测试 这是一本伟大的读物,有助于你的努力:
如果您想以某种特定的方式运行您的所有测试方法,而不仅仅是在
@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,因为优先级问题。尝试使用TestNG框架中的
dependsOnMethods
依赖项。首先,您不需要顺序
或单线程
参数。您只需要在套件中编写单个方法。你的问题可能在别的地方。确保您正在使用套件而不是类本身启动测试
如果您不想每次都使用suites(因为它繁琐、容易出错且不灵活),这里有一些解决这个问题的方法
Reporter.log(字符串,布尔值)
。这类似于System.out.println(String)
,但也将字符串保存到TestNG报告中。对于第二个参数,您总是希望传递true,它告诉您消息是否也应该打印到STDOUT。在每个步骤之前执行此操作时,仅测试输出就足以识别有问题(读取失败)的测试步骤
此外,在执行此操作时,还可以使用软资产。这基本上意味着您不必因为一个可选步骤不起作用而中止整个测试并使其失败。您可以继续到下一个临界点,然后中止,或在结束时中止。错误仍将被保存,您可以决定是否将测试运行标记为失败或不稳定@Test(priority=X)
,其中X是一个数字。用优先级标记所有测试方法,它们将按照优先级从低到高的顺序执行。这样做的好处是,您可以将方法放在步骤之间,并且单个注释是独立的。然而,缺点是,这并不强制任何硬依赖,只强制顺序。即,如果优先级为1的方法testA失败,优先级为2的方法testB仍将执行
不过,您可能可以使用侦听器来解决这个问题。我还没试过这个@Test(dependsOnMethods={“testA”})
。注意,这里的参数不是一个字符串,而是一个字符串列表(你的帖子中有错误)。好处是硬依赖性,这意味着当testB依赖于testA时,testA的失败会将testB标记为跳过。此注释的缺点是,您必须将所有方法置于一个非常严格的链中,其中每个方法都依赖于另一个方法。如果你打破了这个链条,比如说有多个方法不依赖于任何东西,或者有一些方法依赖于相同的方法,你将进入地狱厨房不幸的是,同时使用priority和dependsOnMethods并不能达到预期的效果。在使用硬依赖项时,优先级通常被忽略。根据您的注释,我假设您正在使用TestNG。我同意这里的其他人的观点,即“顺序”不是前进的方向 选项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:优先级
如果您的目的是执行所有测试,无论上游测试是否通过,您都可以使用优先级
像这样:
// 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
}
其他注释
我完全同意sircapsalot的观点,即测试应该是小型和独立的。如果您使用了很多依赖项,那么您的整个测试框架可能会有问题
也就是说,有些测试需要先运行,有些测试需要最后运行,等等。如果其他测试失败,有些测试应该跳过。例如,如果您有测试“updateO”