TestNG 是一个面向 Java 的测试框架,受 JUnit 和 NUnit 启发,并引入并行测试与数据驱动测试等功能,使其更强大、更易用。
用途:适合企业级 Java 测试、复杂测试依赖图、通过 DataProvider 的数据驱动测试,以及大规模 Selenium/Appium 测试套件(通过 testng.xml 套件描述符编排多浏览器测试矩阵)。
主要能力:使用声明式的 testng.xml 管理套件,可跨包编排多套件、多线程运行;通过 @Test(dependsOnMethods = {"..."}) 定义方法依赖,确保下游测试仅在前置测试通过时执行;通过 @DataProvider 向测试方法传入多维测试数据;使用 @Test(groups = {...}) 对测试分组以便选择性执行;支持并行执行(如 parallel="methods" 配合 thread-count);可通过实现 ITestListener 定制报告,使用 SoftAssert 做多字段软断言。
使用方式:编写测试类并使用 TestNG 注解与断言,例如 @Test(groups = {"fast"}) 配合 Assert.assertEquals;用 testng.xml 定义 suite、test、classes 与 groups,并通过 parallel、thread-count、parameter 等属性控制运行;DataProvider 方法需返回 Object[][] 或 Iterator<Object[]>。
最佳实践:独立测试尽量并行;用分组标记 smoke、nightly 等类别;并行套件中共享驱动或上下文应使用 ThreadLocal 保证线程安全;避免过度使用 dependsOnMethods;浏览器参数应通过 testng.xml 参数动态传入而非硬编码。
常见问题与限制:类路径找不到类通常因 testng.xml 中类名拼写错误或测试类未编译(可先运行 mvn test-compile);报 Method requires a @DataProvider 多因名称不匹配或签名无效;并行运行出现 ConcurrentModificationException 多因共享非线程安全状态,应使用 ThreadLocal 或按测试实例隔离状态。更深入的官方细节可参考 TestNG 文档。