Testng测试执行未按字母顺序进行

时间:2018-10-30 07:44:47

标签: testng

我具有下面的@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

请让我知道问题出在哪里以及如何按预期顺序执行以上操作

5 个答案:

答案 0 :(得分:2)

我将向@Mitul Lakhani解释的问题(https://stackoverflow.com/a/53060920/679824)之一添加更多的信息

TestNG依赖于反射。当我们使用Java Reflection API对一个类进行内省以找出其中可用的测试方法时,它不保证方法的顺序。因此,永远不能保证独立方法(不具有软依赖性或硬依赖性)的执行顺序。

  • 软件依赖项-通常在TestNG中通过将priority批注使用@Test属性来实现。之所以称为软依赖性,是因为即使具有更高优先级的先前方法失败了,TestNG也会继续执行所有方法。
  • 硬依赖性-这通常在TestNG中通过将dependsOnMethods批注使用dependsOnGroups(或)@Test属性来实现。之所以称为硬依赖性,是因为只有当上游方法成功运行时,TestNG才会继续执行下游方法。

现在假设您的类只有独立的方法(即您没有使用priority / dependsOnMethods / dependsOnGroups的任何排序属性,那么您基本上可以利用一个TestNG侦听器,用于对方法进行排序。

您可以通过实现org.testng.IMethodInterceptor接口,然后通过以下方式之一在实现中进行接线来实现此目的:

  1. @Listeners注释
  2. <listeners>标签
  3. TestNG的服务加载功能

有关一般如何与听众一起使用的更多信息,请参阅我的博客文章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(){
}