拓展阅读
test-01-java 单元测试框架 junit 入门介绍
test-02-java 单元测试框架 junit5 入门介绍
test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比
test assert-01-Google Truth 断言
test 系统学习-03-TestNG Spock testng 入门使用教程
开源推荐
testNG 的入门案例,包含 maven 引入
maven 依赖
<dependencies>
    <!-- TestNG -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.3.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>
测试类,和 junit 差不多:
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestNGExampleTest {
    @Test
    public void testAddition() {
        // 测试相加方法
        int result = add(2, 3);
        // 使用断言验证结果
        Assert.assertEquals(result, 5, "Addition failed: Expected 5, but got " + result);
    }
    @Test
    public void testSubtraction() {
        // 测试相减方法
        int result = subtract(5, 3);
        // 使用断言验证结果
        Assert.assertTrue(result > 0, "Subtraction failed: Expected result to be greater than 0");
    }
    private int add(int a, int b) {
        // 实际的相加方法
        return a + b;
    }
    private int subtract(int a, int b) {
        // 实际的相减方法
        return a - b;
    }
}
为什么已经有 junit4 了,还会有 testNG 呢?
JUnit 4 和 TestNG 都是用于Java应用程序测试的流行测试框架,它们有一些相似之处,但也有一些不同之处,导致在某些情况下选择使用 TestNG。
以下是一些原因:
-  更灵活的测试配置: TestNG 提供了更灵活的测试配置选项,可以通过 XML 文件进行配置,允许开发人员更细粒度地控制测试的执行方式,包括并发测试、测试组、测试套件等。 
-  注解的丰富性: TestNG 提供了更多的注解,例如 @BeforeSuite、@AfterSuite、@BeforeTest、@AfterTest等,使测试方法的组织更加灵活。TestNG 的注解支持更丰富的测试生命周期管理。
-  参数化测试: TestNG 提供了更强大的参数化测试支持,通过 @DataProvider注解,可以更轻松地实现数据驱动测试。
-  依赖测试: TestNG 具有更强大的依赖测试支持,可以通过 dependsOnMethods或dependsOnGroups属性指定测试方法之间的依赖关系,确保测试方法按照指定的顺序执行。
-  测试分组和套件: TestNG 提供了更灵活的测试分组和测试套件功能,可以按照不同的维度组织测试,更容易管理和执行特定组的测试。 
-  并发测试: TestNG 内置支持并发测试,可以配置测试套件中的测试以并行执行,提高测试效率。 
-  监听器支持: TestNG 提供了丰富的监听器接口,可以通过实现这些接口定制测试执行期间的行为,例如,在测试开始或结束时执行一些操作。 
-  软断言(Soft Assertions): TestNG 支持软断言,即使在断言失败时,测试方法仍然会继续执行,方便查看所有断言失败的情况。 
-  跳过测试: TestNG 允许在测试方法上使用 @Test(enabled = false)来标记测试方法为禁用状态,而不需要注释掉整个方法。
junit/junit5/testNG 等常见 java 测试框架的对比
| 功能/特性 | JUnit 4 | JUnit 5 | TestNG | 
|---|---|---|---|
| 注解 | @Test,@Before,@After,@Ignore, etc. | @Test,@BeforeEach,@AfterEach,@BeforeAll,@AfterAll, etc. | @Test,@BeforeSuite,@AfterSuite,@BeforeTest,@AfterTest, etc. | 
| 参数化测试 | 使用 @Parameters注解 | 支持参数化测试方法,通过 @ParameterizedTest和@ValueSource等注解 | 支持参数化测试方法,通过 @Parameters注解 | 
| 断言 | 使用 JUnit 提供的 Assert类 | 使用 JUnit 5 提供的 Assertions类 | 使用 TestNG 提供的 Assert类 | 
| 测试生命周期 | 单一测试生命周期( @Before和@After在每个测试方法前后执行) | 更灵活的测试生命周期,可以使用 @BeforeEach、@AfterEach、@BeforeAll、@AfterAll | 更灵活的测试生命周期,支持 @BeforeSuite、@AfterSuite、@BeforeTest、@AfterTest等 | 
| 依赖测试 | 通过方法名指定依赖关系 | 使用 dependsOnMethods属性指定测试方法的依赖关系 | 使用 dependsOnMethods或dependsOnGroups属性指定测试方法或测试组之间的依赖关系 | 
| 并发测试 | 不直接支持并发测试 | 支持并发测试,可以配置测试类或测试方法并发执行 | 支持并发测试,可以在测试套件或测试方法级别设置并发数 | 
| 测试分组 | 通过命名规则或自定义注解进行分组 | 使用 @Tag注解进行分组 | 使用 @Test(groups = "groupname")进行分组 | 
| 测试套件 | 不直接支持测试套件 | 使用 @RunWith注解和@Suite注解支持测试套件 | 支持通过 XML 文件配置测试套件 | 
| 数据驱动测试 | 通常通过参数化测试实现 | 支持参数化测试和动态测试(通过 @TestFactory实现) | 支持数据驱动测试,通过 @DataProvider注解提供测试数据 | 
| 监听器 | 通过实现 TestWatcher接口等实现 | 支持扩展 TestExecutionListener接口和@ExtendWith注解 | 提供了丰富的监听器接口,通过实现这些接口实现监听功能 | 
| 报告生成 | 需要依赖第三方插件,如 Ant 或 Maven 插件 | 支持通过插件生成报告,如 Maven Surefire 插件 | 自动生成详细的 HTML 报告 | 
| 软断言 | 不支持软断言 | 不支持软断言,但可以通过异常处理实现类似的效果 | 支持软断言,即使在断言失败时,测试方法仍然会继续执行 | 
| 开发者社区 | 巨大且成熟 | 正在逐渐增长,对于新项目可能还没有 JUnit 4 大 | 成熟且广泛使用,拥有强大的社区支持 | 











