test 系统学习-03-TestNG Spock testng 入门使用教程
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;
}
}
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 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 大 | 成熟且广泛使用,拥有强大的社区支持 |