TestNG 五 运行TestNG

时间:2024-01-04 16:47:38

一、并行运行于超时

可以通过在suite标签中使用 parallel 属性来让测试方法运行在不同的线程中。这个属性可以带有如下这样的值:

  1. <suite name="My suite" parallel="methods" thread-count="5">
  2. <suite name="My suite" parallel="tests" thread-count="5">
  3. <suite name="My suite" parallel="classes" thread-count="5">

1.parallel="methods": TestNG 会在不同的线程中运行测试方法,除非那些互相依赖的方法。那些相互依赖的方法会运行在同一个线程中,并且遵照其执行顺序。

2.parallel="tests": TestNG 会在相同的线程中运行相同的<test>标记下的所有方法,但是每个<test>标签中的所有方法会运行在不同的线程中。这样就允许你把所有非线程安全的类分组到同一个<test>标签下,并且使其可以利用TestNG多线程的特性的同时,让这些类运行在相同的线程中。

3.parallel="classes": TestNG 会在相同线程中相同类中的运行所有的方法,但是每个类都会用不同的线程运行。

此外,属性 thread-count 允许你为当前的执行指定可以运行的线程数量。

注意:@Test 中的属性 timeOut 可以工作在并行和非并行两种模式下。

你也可以指定 @Test 方法在不同的线程中被调用。你可以使用属性 threadPoolSize 来实现:

@Test(threadPoolSize = 3, invocationCount =10,  timeOut = 10000)

public void testServer() {

上例中,方法 testServer 会在3个线程中调用10次。此外,10秒钟的超时设定也保证了这三个线程中的任何一个都永远不会阻塞当前被调用的线程。

二、再次运行失败的测试

每次测试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。

三、JUnit测试

TestNG 能够运行 JUnit 测试。所有要做的工作就是在testng.classNames 属性中设定要运行的JUnit测试类,并且把 testng.junit 属性设置为true:

<test name="Test1"   junit="true">

<classes>

<!-- ... -->

TestNG 在这种情况下所表现的行为与 JUnit 相似:

1.所有类中要运行的测试方法由 test* 开头

2.如果类中有 setUp() 方法,则其会在每个测试方法执行前被调用

3.如果类中有 tearDown() 方法,则其会在每个测试方法之后被调用

4.如果测试类包含 suite() 方法,则所有的被这个方法返回的测试类都会被调用

四、方法拦截器

一旦TestNG 计算好了测试方法会以怎样的顺序调用,那么这些方法就会分为两组:

1.按照顺序运行的方法。这里所有的方法都有相关的依赖,并且所有这些方法按照特定顺序运行。

2.不定顺序运行的方法。这里的方法不属于第一个类别。方法的运行顺序是随机的,下一个说不准是什么(尽管如此,默认情况下TestNG会尝试通过类来组织方法)。

为了能够让你更好的控制第二种类别,TestNG定义如下接口:

  1. public interface IMethodInterceptor {
  2. List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context);
  3. }

方法中叫做methods的那个列表参数包含了所有以不定序运行的方法。你的 intercept 方法也要返回一个 IMethodInstance列表,它可能是下面情况之一:

1.内容与参数中接收的一致,但是顺序不同

2.一组 IMethodInstance 对象

3.更大的一组 IMethodInstance对象

一旦你定义了拦截器,就把它传递个TestNG,用下面的方式:

java -classpath"testng-jdk15.jar:test/build" org.testng.TestNG -listenertest.methodinterceptors.NullMethodInterceptor /

-testclass test.methodinterceptors.FooTest

关于ant中对应的语法,参见 listeners 属性ant文档中的说明。

http://testng.org/doc/ant.html

例如,下面是个方法拦截器会重新给方法排序,一遍“fast”组中的方法总是先执行:

  1. public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
  2. List<IMethodInstance> result = new ArrayList<IMethodInstance>();
  3. for (IMethodInstance m : methods) {
  4. Test test = m.getMethod().getMethod().getAnnotation(Test.class);
  5. Set<String> groups = new HashSet<String>();
  6. for (String group : test.groups()) {
  7. groups.add(group);
  8. }
  9. if (groups.contains("fast")) {
  10. result.add(0, m);
  11. }
  12. else {
  13. result.add(m);
  14. }
  15. }
  16. return result;
  17. }

本文转载自http://blog.sina.com.cn/bestfeiyong