Gradle忽略了testng中的优先级

问题描述 投票:1回答:1

有人可以解释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
java gradle automated-tests testng
1个回答
0
投票

我认为这是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 {
...

注意:您也可以使用这种拦截器来实现自定义执行顺序。

© www.soinside.com 2019 - 2024. All rights reserved.