我具有下面的@Test方法的测试类
@Test
public void Submission01(){
}
@Test (dependsOnMethods = "Submission01")
public void Submission02(){
}
@Test
public void Onboarding1(){
}
@Test (dependsOnMethods="Onboarding1")
public void Onboarding2(){
}
使用这些方法在我执行类时,testng按以下顺序执行
Onboarding1
Submission01
Onboarding2
Submission02
我希望在
中执行Onboarding1
Onboarding2
Submission01
Submission02
请让我知道问题出在哪里以及如何按预期顺序执行以上操作
答案 0 :(得分:2)
我将向@Mitul Lakhani解释的问题(https://stackoverflow.com/a/53060920/679824)之一添加更多的信息
TestNG依赖于反射。当我们使用Java Reflection API对一个类进行内省以找出其中可用的测试方法时,它不保证方法的顺序。因此,永远不能保证独立方法(不具有软依赖性或硬依赖性)的执行顺序。
priority
批注使用@Test
属性来实现。之所以称为软依赖性,是因为即使具有更高优先级的先前方法失败了,TestNG也会继续执行所有方法。dependsOnMethods
批注使用dependsOnGroups
(或)@Test
属性来实现。之所以称为硬依赖性,是因为只有当上游方法成功运行时,TestNG才会继续执行下游方法。现在假设您的类只有独立的方法(即您没有使用priority
/ dependsOnMethods
/ dependsOnGroups
的任何排序属性,那么您基本上可以利用一个TestNG侦听器,用于对方法进行排序。
您可以通过实现org.testng.IMethodInterceptor
接口,然后通过以下方式之一在实现中进行接线来实现此目的:
@Listeners
注释<listeners>
标签有关一般如何与听众一起使用的更多信息,请参阅我的博客文章here
这是一个完整的例子,展示了这一点
import com.rationaleemotions.stackoverflow.qn53059530.ExampleTest.MethodOrder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(MethodOrder.class)
public class ExampleTest {
@Test
public void Submission01() {
print();
}
@Test
public void Submission02() {
print();
}
@Test
public void Onboarding1() {
print();
}
@Test
public void Onboarding2() {
print();
}
private void print() {
ITestResult current = Reporter.getCurrentTestResult();
System.err.println("Executing :" + current.getMethod().getMethodName() + "()");
}
public static class MethodOrder implements IMethodInterceptor {
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
List<IMethodInstance> ordered = new ArrayList<>(methods);
ordered.sort(Comparator.comparing(o -> o.getMethod().getMethodName()));
return ordered;
}
}
}
输出如下
Executing :Onboarding1()
Executing :Onboarding2()
Executing :Submission01()
Executing :Submission02()
===============================================
Default Suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================
您可能会注意到,该示例既未使用priority
也未使用dependsOnMethods
/ dependsOnGroups
。
您可以调整侦听器的实现,以决定希望排序的任何方式(例如,按时间顺序排列(或),按相反的时间顺序排列)
答案 1 :(得分:1)
这是TestNG在@Test方法方面的工作方式。
首先,它执行所有“独立”方法。(如果此顺序中存在歧义,则使用优先级来解决独立方法的歧义)
然后它会执行所有具有“ dependsOnGroups / dependsOnMethods”属性的方法。(如果此顺序中存在歧义,则使用优先级来解决独立方法的歧义)
如果由于没有优先级或相同优先级而仍然存在歧义,则以字母顺序执行
答案 2 :(得分:0)
if you are using testNG then you can use priority parameter for this.
@Test(priority=1)
public void Onboarding1(){
}
@Test (dependsOnMethods="Onboarding1",priority=2)
public void Onboarding2(){
}
@Test(priority=3)
public void Submission01(){
}
@Test (dependsOnMethods = "Submission01",priority=4)
public void Submission02(){
}
答案 3 :(得分:0)
据我了解,您的代码存在语法错误。您会错过在TestNG参数(dependsOnMethods = "Submission01")
中加上大括号的感觉,就像(dependsOnMethods = {"Submission01"})
。
希望,下面的示例代码适合您。
@Test
public void Submission01(){
}
@Test (dependsOnMethods = {"Submission01"})
public void Submission02(){
}
@Test
public void Onboarding1(){
}
@Test (dependsOnMethods = {"Onboarding1"})
public void Onboarding2(){
}
答案 4 :(得分:0)
尝试一下...
@Test(dependsOnMethods = "Onboarding2")
public void Submission01{
}
@Test (dependsOnMethods = "Submission01")
public void Submission02(){
}
@Test
public void Onboarding1(){
}
@Test (dependsOnMethods="Onboarding1")
public void Onboarding2(){
}