12.5. TestNG 并发执行与超时控制

12.5.1. 概述

TestNG 提供了多种参数来控制用例的执行次数、并发度和超时时间,常用的有:

  • invocationCount:同一个用例重复执行多次;
  • threadPoolSize:为同一个用例设置线程池并发执行;
  • timeOut:为单个测试方法设置最大执行时间。

这些特性非常适合用于简单的性能验证或接口稳定性回归。

12.5.2. invocationCount:重复执行

通过 invocationCount 可以让同一个测试方法执行多次:

import org.testng.annotations.Test;

public class InvocationExample {

    @Test(invocationCount = 5)
    public void repeatTest() {
        System.out.println("执行 repeatTest 一次");
    }
}

上述示例中,repeatTest 会连续执行 5 次,默认是单线程顺序执行。

12.5.3. threadPoolSize:并发执行

invocationCount 配合使用时,通过 threadPoolSize 可以让同一个测试方法在多个线程中并发执行:

public class ConcurrencyExample {

    @Test(invocationCount = 10, threadPoolSize = 5)
    public void concurrentTest() {
        System.out.println("线程: " + Thread.currentThread().getName());
    }
}

说明:

  • 这里总共执行 10 次,用 5 个线程并发执行;
  • 常用于对某个接口或方法做简单的并发压测。

12.5.4. timeOut:方法级超时

为单个测试方法设置最大执行时间(单位:毫秒):

public class TimeOutExample {

    @Test(timeOut = 1000)
    public void longRunning() throws InterruptedException {
        // 小于 1 秒则通过,大于 1 秒则失败
        Thread.sleep(500);
    }
}

如果方法执行时间超过设置的 timeOut,则该用例会被标记为失败。

12.5.5. 综合示例:简单压测

下面的示例演示了一个简单的“多线程 + 超时控制”的组合用法:

import org.testng.annotations.Test;

public class PerformanceExample {

    @Test(invocationCount = 10, threadPoolSize = 5, timeOut = 2000)
    public void stressApi() throws InterruptedException {
        // TODO: 这里可以调用实际的接口
        Thread.sleep(100);
    }
}

说明:

  • 总共执行 10 次,使用 5 个线程并发;
  • 每次执行最长允许 2 秒,超过则视为失败。

12.5.6. 注意事项

  • TestNG 的并发能力适合做 轻量级的并发验证,不建议直接替代专业性能测试工具(如 JMeter);
  • 并发测试时要注意被测接口是否具备幂等性、线程安全性等;
  • 当并发度较高或逻辑较复杂时,建议配合专门的性能测试工具和监控系统使用。

12.5.7. 小结

本篇介绍了 TestNG 在并发执行与超时控制方面的基础能力,通过灵活组合 invocationCountthreadPoolSizetimeOut,可以快速构建一些简单的稳定性或压力验证用例。