TestNG 并行执行技能,用于配置 TestNG 的并行测试执行,包括线程池、套件配置与同步。目标是最大化测试吞吐量,同时保持测试可靠性。
一、用途 TestNG 支持在多个层级进行并行执行:套件(suite)、测试(test)、类(class)和方法(method)。合理的并行配置可以显著减少测试执行时间,但需要仔细考虑线程安全与资源管理。
二、并行执行模式
- 套件级并行:在 suite 标签设置 parallel="tests" 与 thread-count,让多个 <test> 标签并行运行。示例中为 Chrome、Firefox、Safari 三个测试并行,thread-count="3"。
- 类级并行:设置 parallel="classes",让多个测试类并行运行,示例 thread-count="4"。
- 方法级并行:设置 parallel="methods",让测试方法并行运行,示例 thread-count="5"。
- 实例级并行:设置 parallel="instances",让测试实例并行运行,常与 Factory 配合使用,示例 thread-count="3"。
三、线程池配置
- 基础线程配置:套件级 thread-count 作为全局线程池配置,可在具体 <test> 中通过 thread-count 覆盖。
- DataProvider 并行:在 suite 上设置 data-provider-thread-count,并在 @DataProvider 上设置 parallel = true,使数据行并行执行。示例中 data-provider-thread-count="20",提供 100 行数据。
四、线程安全模式
- ThreadLocal 存储:为每个线程保存独立资源(如 WebDriver、session),在 @BeforeMethod 中 set,在 @AfterMethod 中 remove。
- 同步共享资源:使用 AtomicInteger、ConcurrentHashMap 等线程安全结构;对临界区使用 synchronized 块。示例使用 @Test(threadPoolSize = 5, invocationCount = 100) 等。
- 不可变测试数据:使用 Collections.unmodifiableList、Collections.unmodifiableMap 等不可变数据,天然线程安全。
五、测试隔离模式
- 独立测试方法:每个测试方法创建并清理自己的资源,不共享状态。
- 隔离数据库测试:在 @BeforeMethod 中为每个测试创建独立 schema(结合线程 ID 与时间戳),在 @AfterMethod 中删除 schema,实现完全隔离。
六、并行执行与依赖
- 组内保序:设置 preserve-order="true",类并行但方法按 include 顺序执行。
- 分组线程:设置 group-by-instances="true",配合 @Factory 创建多个实例,实例内方法通过 dependsOnMethods 保持依赖顺序。
七、性能优化
- 最优线程数:根据 Runtime.getRuntime().availableProcessors() 计算,CPU 密集型取处理器数,I/O 密集型取处理器数×2,混合负载取约 1.5 倍。
- 资源池模式:使用 BlockingQueue 实现连接池,在 @BeforeSuite 初始化、@AfterSuite 清理,测试中借出与归还连接。
八、并行测试报告与超时
- 自定义报告:实现 ITestListener,使用 ConcurrentHashMap 记录线程与测试映射,在 onFinish 输出线程分布报告。
- 超时配置:方法级 @Test(timeOut = 5000);套件级 time-out="60000";测试级 time-out="10000"。
九、最佳实践
- 为独立性而设计:测试不应依赖共享可变状态。
- 使用 ThreadLocal 管理每线程资源:驱动、会话、连接。
- 优先使用不可变数据:天然线程安全。
- 设置合适的线程数(原文此处截断,未提供完整内容)。
十、适用场景与限制 适用于 Java 环境下使用 TestNG 的测试项目,尤其是需要缩短执行时间、支持多浏览器或多服务并行验证的场景。限制方面:并行会引入线程安全与资源竞争风险,需要测试隔离、同步与资源池设计;线程数需结合 CPU 与 I/O 特性调整;原文未提供具体版本要求、安装命令或收费信息。