2013年6月

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是不能重新利用了,必须要进行一定的修正才可以再次使用。