我没有通过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);
}
在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触发测试执行。