有人可以解释gradle如何与testng中@Test批注中的priority参数一起使用吗?例如,我有下一个代码:
public class TestGradle {
@Test (priority = 2)
public void testA() throws Exception {
System.out.println("Test A");
}
@Test (priority = 1)
public void testB() throws Exception {
System.out.println("Test B");
}
@Test (priority = 3)
public void testC() throws Exception {
System.out.println("Test C");
}
}
因此,如果我将通过gradle test --tests TestGradle
运行它,则将获得下一个输出:
Test A
Test B
Test C
但是我想应该是这样的:
Test B
Test A
Test C
我认为这是TestNG中的错误。我创建了一个issue。
您可以创建解决方法来解决此问题。使用IMethodInterceptor
,可以更改方法的执行顺序。
public class ExecutionOrderInterceptor implements IMethodInterceptor {
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
private int getPriority(IMethodInstance mi) {
int result = 0;
Method method = mi.getMethod().getConstructorOrMethod().getMethod();
Test a1 = method.getAnnotation(Test.class);
if (a1 != null) {
result = a1.priority();
}
return result;
}
public int compare(IMethodInstance m1, IMethodInstance m2) {
return getPriority(m1) - getPriority(m2);
}
};
IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
Arrays.sort(array, comparator);
return Arrays.asList(array);
}
}
要使用此拦截器,您需要在测试类中添加注释:
@Listeners({ TestReportListener.class })
public class MyTestClass {
...
您还可以创建测试类扩展的抽象类:
@Listeners({ TestReportListener.class })
public abstract class BaseTest {
//Add here common code
}
并在测试课程中使用它:
public class MyTestClass extends BaseTest {
...
注意:您也可以使用这种拦截器来实现自定义执行顺序。