我有3个课程,每个课程有3个测试。
第1类
@Test( priority = 1 )
public void testA1() {
System.out.println("testA1");
}
@Test( priority = 2 )
public void testA2() {
System.out.println("testA2");
}
@Test( priority = 3 )
public void testA3() {
System.out.println("testA3");
}
第2类
@Test( priority = 1 )
public void testB1() {
System.out.println("testB1");
}
@Test( priority = 2 )
public void testB2() {
System.out.println("testB2");
}
@Test( priority = 3 )
public void testB3() {
System.out.println("testB3");
}
第3类
@Test( priority = 1 )
public void testC1() {
System.out.println("testC1");
}
@Test( priority = 2 )
public void testC2() {
System.out.println("testC2");
}
@Test( priority = 3 )
public void testC3() {
System.out.println("testC3");
}
这是我的XML文件代码。
<test verbose="2" name="hello" group-by-instances="true">
<classes>
<class name="Class1"></class>
<class name="Class2"></class>
<class name="Class3"></class>
</classes>
</test>
这是我的答案 testA1 testB1 testC1 testA2 testB2 testC2 testA3 testB3 testC3
但我的预期答案是 testA1 testA2 testA3 testB1 testB2 testB3 testC1 testC2 testC3
提前感谢您提供任何帮助。
答案 0 :(得分:1)
看到的行为是预期的行为。
事实上,priority
更为重要group-by-instances
(https://github.com/cbeust/testng/blob/master/CHANGES.txt#L48)
这就是为什么TestNG尊重priority
而不是group-by-instances
。
要实现预期的行为,您必须将priority
替换为更重要的订单功能,例如dependsOnMethods
:
@Test
public void testA1() {
System.out.println("testA1");
}
@Test( dependsOnMethods = "testA1" )
public void testA2() {
System.out.println("testA2");
}
@Test( dependsOnMethods = "testA2" )
public void testA3() {
System.out.println("testA3");
}
如评论中所述,如果您真的想要“没有强烈依赖性的课程的优先级”,您可以使用a method interceptor自行创建,您可以根据需要订购方法。在伪代码中,类似于:
public class PriorityOnClassOrder implements IMethodInterceptor {
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
// 1. Group by instance/class
Map<Class<?>, List<IMethodInstance>> map = ...
for (IMethodInstance method : methods) {
map.get(method.getInstance().getClass()).add(method);
}
List<IMethodInstance> result = ...
// 2. Order methods from an instance/clas according to their priority
for(Map.Entry entry : map.entries()) {
List<IMethodInstance> m = entry.value();
Collections.sort(m, new Comparator<IMethodInstance>() {
public int compare(IMethodInstance o1, IMethodInstance o2) {
return o1.getMethod().getPriority() - o2.getMethod().getPriority()
}
});
result.addAll(m);
}
// 3. Return the result
return result;
}
}
答案 1 :(得分:0)
正如您可能已经注意到的那样,优先级标志会影响整个而不是单个类。最简单的方法是增加第二类的优先级。
@Test( priority = 4 )
public void testA1() {
System.out.println("testA1");
}
@Test( priority = 5 )
public void testA2() {
System.out.println("testA2");
}
@Test( priority = 6 )
public void testA3() {
System.out.println("testA3");
}
此外,您可以将单个课程单独放入,我认为如果您想要分开测试域,情况会更好。
<test name="Test1" verbose="3" >
<classes>
<class name="tests.NewTest"></class>
</classes>
</test> <!-- Test -->
<test name="Test2" verbose="3" >
<classes>
<class name="tests.NewTest2"></class>
</classes>
</test>
verbose
标志。在调试过程中我几乎不推荐这个。
答案 2 :(得分:0)
最后我得到了问题的解决方案。
请参阅以下XML代码。
<classes>
<class name="Class1">
<methods>
<include name="testA1" />
<include name="testA2" />
<include name="testA3" />
</methods>
</class>
<class name="Class2">
<methods>
<include name="testB1" />
<include name="testB2" />
<include name="testB3" />
</methods>
</class>
<class name="Class3">
<methods>
<include name="testC1" />
<include name="testC2" />
<include name="testC3" />
</methods>
</class>
这会给你预期的结果。此外,它也更容易管理。好像我们想要查看我的所有测试或删除一些测试,我可以查看test.xml