1. 重新运行失败用例
每当suite中的测试失败时,TestNG都会在输出目录中创建一个名为testng-failed.xml的文件。该XML文件包含必要的信息,以此来重新运行失败的这些方法,从而使您可以快速重现失败,而不必运行整个测试。如下所示:
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs test-outputs\testng-failed.xml
注:testng-failed.xml包含所有必需的依赖方法,因此可以确保运行失败的方法时不会出现任何SKIP失败。
有时,可能希望TestNG在测试失败时自动重试。在这种情况下,可以使用重试分析器(retry analyzer)。将重试分析器绑定到测试时,TestNG会自动调用重试分析器,以确定TestNG是否可以再次重试测试用例,来尝试查看刚刚失败的测试是否通过。
使用重试分析器的步骤:
- 构建接口org.testng.IRetryAnalyzer的实现
- 将实现绑定到@Test注解,例如@Test(retryAnalyzer = LocalRetry.class)
以下是重试分析器的示例实现,该示例最多重试一次测试三次。
import org.testng.IRetryAnalyzer; import org.testng.ITestResult; public class MyRetry implements IRetryAnalyzer { private int retryCount = 0; private static final int maxRetryCount = 3; @Override public boolean retry(ITestResult result) { if (retryCount < maxRetryCount) { retryCount++; return true; } return false; } }
import org.testng.Assert; import org.testng.annotations.Test; public class TestclassSample { @Test(retryAnalyzer = MyRetry.class) public void test2() { Assert.fail(); } }
2. Junit测试框架的支持
TestNG可以运行JUnit 3和JUnit 4测试。您需要做的就是将JUnit jar文件放在类路径上,在testng.classNames属性中指定您的JUnit测试类,并将testng.junit属性设置为true:
<test name="Test1" junit="true"> <classes> <!-- ... -->
在这种情况下,TestNG根据在类路径上找到的JUnit版本执行类似于JUnit的方法:
- JUnit 3
- 类中所有以test *开头的方法都将运行。
- 如果您的测试类上有一个方法setUp(),它将在每个测试方法之前调用。
- 如果您的测试类上有一个方法tearDown(),它将在每个测试方法之后被调用
- 如果您的测试类包含方法suite(),则将调用此方法返回的所有测试用例。
- JUnit4
- TestNG将使用org.junit.runner.JUnitCore运行程序运行测试用例。
3. 在程序中调用testng
可以很容易地从自己的程序中调用TestNG:
TestListenerAdapter tla = new TestListenerAdapter(); TestNG testng = new TestNG(); testng.setTestClasses(new Class[] { Run2.class }); testng.addListener(tla); testng.run();
该示例创建一个TestNG对象并运行测试类Run2。它还添加了一个TestListener。可以使用适配器类org.testng.TestListenerAdapter或自己实现org.testng.ITestListener。该接口包含各种回调方法,可以跟踪测试的开始时间,成功时间,失败时间等。
同样,您可以在testng.xml文件上调用TestNG,也可以自己创建一个虚拟的testng.xml文件。可以使用包org.testng.xml中的类:XmlClass,XmlTest等。这些类中的每一个都对应于它们的XML标记。
假设想生成如下虚拟文件:
<suite name="TmpSuite" > <test name="TmpTest" > <classes> <class name="test.failures.Child" /> <classes> </test> </suite>
可以使用如下代码:
XmlSuite suite = new XmlSuite(); suite.setName("TmpSuite"); XmlTest test = new XmlTest(suite); test.setName("TmpTest"); List<XmlClass> classes = new ArrayList<XmlClass>(); classes.add(new XmlClass("test.failures.Child")); test.setXmlClasses(classes) ;
然后可以将此XmlSuite传递给TestNG:
List<XmlSuite> suites = new ArrayList<XmlSuite>(); suites.add(suite); TestNG tng = new TestNG(); tng.setXmlSuites(suites); tng.run();
欢迎关注交流~