需要一种在TestNG中使用xmlSuites依次运行测试的方法。

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

我没有通过testng xml运行我的testcases,而是使用了

TestListener listener=new TestListener();
    XmlSuite suite=new XmlSuite();
    suite.setName("Test Results");
    suite.setParallel(ParallelMode.NONE);
    suite.setThreadCount(Integer.parseInt(TestProperties.THREAD_COUNT.toString()));
    List<XmlSuite> suits=new ArrayList<XmlSuite>();
    suits.add(suite);


    List<XmlPackage> xpackage=new ArrayList<XmlPackage>();
    xpackage.add(new XmlPackage(TestProperties.TESTNG_PACKAGE.toString()));


    XmlTest test=new XmlTest(suite);
    test.setPackages(xpackage);
    //test.setParallel(ParallelMode.NONE);
    String groups=TestProperties.TESTNG_GROUP.toString();
    System.out.println("groups are:"+groups);
    String groupArray[]=groups.split(",");
    List<String> includedGroups=new ArrayList<String>();
    includedGroups.addAll(Arrays.asList(groupArray));
    test.setIncludedGroups(includedGroups);


    TestNG tng=new TestNG();
    tng.setOutputDirectory("test-output");
    tng.setXmlSuites(suits);
    //tng.addListener((ITestNGListener) listener);
    tng.run();
    System.exit(0)

我需要我的测试按顺序运行,因为有很多因素。我试过使用parallelMode.none,保留顺序等,但是我的测试用例被以一种奇怪的方式运行,通常是数字方式。例如,在200之后,我的测试用例在代码中的顺序是211,212,213等,之后是201,202等。我需要它按照这个顺序运行。但是现在,在200之后,测试case运行的顺序是201。我怎样才能让testcase按照它们指定的顺序运行。

我也试过让测试用例211,212等优先运行,但也没有用。我添加了方法inteceptor,但我的行号总是给1。

public class PriorityInterceptor implements IMethodInterceptor {

public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {

    Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
        private int getLineNo(IMethodInstance mi) {
        int result = 0;

        String methodName = mi.getMethod().getMethodName();
        String className  = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
        ClassPool pool    = ClassPool.getDefault();

        try {
            CtClass cc        = pool.get(className);
            CtMethod ctMethod = cc.getDeclaredMethod(methodName);
            System.out.println(methodName);
            result            = ctMethod.getMethodInfo().getLineNumber(0);
            System.out.println("result:"+result+"and method:"+ctMethod);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }

        return result;
        }

        public int compare(IMethodInstance m1, IMethodInstance m2) {
            System.out.println(getLineNo(m1) - getLineNo(m2));
        return getLineNo(m1) - getLineNo(m2);
        }
    };

    IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
    Arrays.sort(array, comparator);
    System.out.println("22222222222222222222222222222222222222222222222222222222");
    System.out.println(Arrays.asList(array));
    return Arrays.asList(array);
    }
java selenium automation testng
1个回答
0
投票

在testng XML文件中,有一个叫做preservation-order = true的东西。你可以用那个来保存执行顺序。

对于程序化执行的testng。 在套件级别设置保留顺序

    XmlSuite xmlsuite = new XmlSuite();
    xmlsuite.setPreserveOrder(true);

在测试层设置保存顺序 这里的test指的是测试标签,而不是@Test注解。

List<XmlTest> tests = xmlsuite.getTests();
        for (XmlTest test : tests) {
            test.setPreserveOrder(true);
            .....
}

如果你想让 @Test 的执行有一定的顺序,你可以在使用 @Test 注解的同时使用优先级和 dependsOnMethods。如果你在下面的例子中使用了 dependsOnMethods,那么 method2 将只在 method1 成功运行后才开始。如果方法1由于某种原因失败了,那么方法2将被标记为跳过。

例子:

@Test(priority=1)
public void method1(){}

@Test(priority=2)
public void method2(){}

@Test
public void method1(){}

@Test(dependsOnMethods="method1")
public void method2(){}

使用testng XML文件执行

<suite name="Test_Suite_Name" verbose="1" preserve-order="true">
    <test name="TEST_TESTCLASSA" preserve-order="true">
        <classes>
            <class name="testpackage.TestClassA"/>
        </classes>
    </test>
    <test name="TEST_OTHER_TESTS" preserve-order="true">
        <classes>
            <class name="testpackage.TestClassB"/>
            <class name ="testpackage.TestClassC"/>
            <class name="testpackage.TestClassD"/>
            <class name="testpackage.TestClassE"/>
            <class name="testpackage.TestClassF"/>
            <class name="testpackage.TestClassG"/>
        </classes>
    </test>
</suite>

重要说明如果使用 preserve-order 标志,在程序化执行的情况下,将按照 List 中出现的顺序执行,而在 testng xml 文件中则按照出现的顺序执行。

一个建议当使用程序化执行testng时,请不要在你的代码中硬编码类。你可以随时解析一个现有的testng XML文件,并在运行时根据你的要求调整它,然后使用程序化testng触发测试执行。

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