TestNG重复执行失败用例的问题
TestNG在执行完用例后会在test-output目录下生成一些结果文件,其中testng-results.xml与testng-failed.xml是我们经常会关注的。
testng-results.xml是描述了TestNG整个执行结果。相当于eclipse中的小红条与小绿条。文件中记录了用例执行的异常信息,可以用来排查出现问题的用例。
testng-failed.xml是记录了上一次所有执行失败的用例,如果想重新运行一遍失败的用例,这个文件就派上用场了。testng-failed.xml可以直接拿来使用TestNG执行,对于一些不稳定的用例就很有用。
通常我们使用TestNG会用到数据驱动的功能,同一个脚本可以传递许多个不同的参数。如果其中某几次失败了,我们再次运行用例时只需要执行失败的用例就可以了,而成功的用例不希望再次去执行。TestNG解决这个问题的方法是记录一个Method第几次被调用时失败了,反应到testng-failed.xml文件中就是invocation-numbers(调用编号)这个属性。
假如有一个脚本是这样写的:
#!java
public class Script {
@DataProvider(name = "providerMethod")
public Object[][] providerMethod() {
return new Object[][] {
{ "001" },
{ "002" },
{ "003" },
{ "004" },
};
}
@Test(dataProvider="providerMethod")
public void testFoo(String caseId) {
assertNotEquals(caseId,"002");
}
}
传递的参数依次为:001, 002, 003, 004,很明显的是当caseId=002时,用例会失败。那么记录在testng-failed.xml文件中应该是这个样子的:
#!xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="Nopackage" >
<classes>
<class name="Script">
<methods>
<include name="setUp"/>
<include name="testFoo" invocation-numbers="1"/>
</methods>
</class>
</classes>
</test>
</suite>
testng-failed.xml文件中的invocation-numbers="1",表示这是第2次调用方法testFoo时用例失败了(invocation-numbers是从0开始计数的)。使用testng-failed.xml重跑用例时,如果使用了数据驱动,将只会执行执行失败的那一行数据。秘密就在这个XML中的 invocation-numbers参数。
这个方法固然方便,但有一个问题必须注意,比如原始的testng-failed.xml中invocation-numbers="1 2",表示执行第2、3行的数据,但如果第2行数据再次执行失败的话,invocation-numbers 变成了 "0",这个时候,如果再去执行 testng-failed.xml,含义就变了,不再是预期的执行第2行数据,而是执行第1行数据。也就是说使用testng-failed.xml重跑用例的操作方式只有1次利用价值。
还是用上面的示例,当使用上面的testng-failed.xml去执行用例的时候,只执行caseId="002"的那一行,用例仍然会报错,但此时再次生成出来的testng-failed.xml是这样子的:
#!xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="Nopackage" >
<classes>
<class name="Script">
<methods>
<include name="setUp"/>
<include name="testFoo" invocation-numbers="0"/>
</methods>
</class>
</classes>
</test>
</suite>
这个二次生成的testng-failed.xml是不能重新利用了,必须要进行一定的修正才可以再次使用。