TestNG入门(一):基础注解与生命周期管理
大家好我是
NBA球星伦纳德, 以后持续在牛客分享自己的学习笔记!欢迎大家关注 接下来大家带来TestNG的入门学习, 计划分为四期内容介绍!
TestNG入门(一):基础注解与生命周期管理
1. TestNG简介
TestNG(Test Next Generation)是一个强大的Java测试框架,专为简化广泛的测试需求而设计。它是JUnit的继承者,但引入了许多新功能,使得测试更加灵活和强大。
1.1 TestNG官网与背景
- 官方网站: https://testng.org
- GitHub仓库: https://github.com/cbeust/testng
TestNG的设计理念是提供比JUnit更丰富的功能,特别适合:
- 单元测试
- 集成测试
- 端到端测试
- 性能测试
1.2 TestNG vs JUnit
| 特性 | TestNG | JUnit |
|---|---|---|
| 参数化测试 | @DataProvider (更强大) |
@Parameterized |
| 分组测试 | 支持 | 有限支持 |
| 依赖测试 | dependsOnMethods |
@DependsOn (有限) |
| 并发测试 | 内置支持 | 需要额外配置 |
| 监听器 | 丰富的监听器接口 | 较少 |
2. 项目实战:计算器测试
在这个项目中,我们将通过一个简单的计算器应用来学习TestNG的核心概念。
2.1 被测类:Calculator
首先,我们有一个简单的计算器类,包含基本的数学运算:
package org.example.proj1;
/**
* 简单计算器:要测试的目标
*/
public class Calculator {
// 加法
public int add(int a, int b) {
return a + b;
}
// 减法
public int subtract(int a, int b) {
return a - b;
}
// 乘法 (假设这个功能还没开发完,或者不稳定)
public int multiply(int a, int b) {
return a * b;
}
// 除法
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("除数不能为0");
}
return a / b;
}
}
2.2 TestNG生命周期注解
TestNG提供了一套完整的生命周期管理注解,让我们能够精确控制测试的执行流程:
package proj1;
import org.example.proj1.Calculator;
import org.testng.Assert;
import org.testng.annotations.*;
/**
* Suite --> Test -- > Class --> Method
* Assert是自动化测试的核心
* 正常测试 -- 异常测试(检测是否抛出异常) -- 忽略测试(适用于未准备好的场景)
* 目标:
* 1. 了解常见的注解
* 2. 了解生命周期
*/
public class CalculatorTest {
// 定义被测对象
private Calculator calculator;
// --- 1. 生命周期注解 ---
@BeforeSuite
public void beforeSuite() {
System.out.println("【BeforeSuite】测试套件开始初始化... (通常用于连接数据库或全局配置)");
}
@AfterSuite
public void afterSuite() {
System.out.println("【AfterSuite】测试套件结束... (通常用于清理全局数据)");
}
@BeforeClass
public void setUp() {
System.out.println("【BeforeClass】测试类开始初始化...");
// 在本类测试方法之前, 只执行一次
calculator = new Calculator();
}
@AfterClass
public void tearDown() {
System.out.println("【AfterClass】测试类结束... (通常用于清理测试类实例)");
// 在本类测试方法之后, 只执行一次
calculator = null;
}
@BeforeMethod
public void beforeMethod() {
// 每个@Test方法, 都会执行一次 适合重置数据状态(比如清空数据列表)
System.out.println("【BeforeMethod】测试开始...");
}
@AfterMethod
public void afterMethod() {
// 每个@Test方法, 都会执行一次
System.out.println("【AfterMethod】测试结束...");
}
2.3 生命周期执行顺序
TestNG的生命周期注解按照以下顺序执行:
@BeforeSuite- 整个测试套件开始前执行一次@BeforeClass- 当前测试类开始前执行一次@BeforeMethod- 每个测试方法执行前都会执行@Test- 实际的测试方法@AfterMethod- 每个测试方法执行后都会执行@AfterClass- 当前测试类结束后执行一次@AfterSuite- 整个测试套件结束后执行一次
2.4 核心测试注解详解
2.4.1 @Test 注解
@Test是TestNG中最基本的注解,用于标记测试方法:
// 正常加法测试
@Test
public void testAdd() {
System.out.println(" --> 执行 testAdd");
int result = calculator.add(1, 2);
Assert.assertEquals(result, 3);
}
// 正常减法测试
@Test
public void testSubtract() {
System.out.println(" --> 执行 testSubtract");
int result = calculator.subtract(3, 2);
Assert.assertEquals(result, 1);
}
2.4.2 异常测试
TestNG提供了异常测试机制,可以验证代码是否按预期抛出异常:
// 异常测试: 除数不能为0
// 如果代码抛出了异常, TestNG会判定测试通过
@Test(expectedExceptions = ArithmeticException.class)
public void testDivideByZero() {
System.out.println(" --> 执行 testDivideByZero");
calculator.divide(1, 0);
}
2.4.3 忽略测试
当某些功能尚未完成或暂时不需要测试时,可以使用enabled = false来忽略测试:
// 忽略测试: 忽略某个测试方法
@Test(enabled = false)
public void testMultiply() {
System.out.println(" --> 执行 testMultiply");
}
2.5 断言机制
TestNG使用Assert类进行断言验证,这是自动化测试的核心:
// 验证预期结果与实际结果是否相等
Assert.assertEquals(result, 3);
// 验证条件是否为true
Assert.assertTrue(result > 0);
// 验证条件是否为false
Assert.assertFalse(result < 0);
2.6 测试执行结果
运行测试后,你会看到类似如下的输出:
【BeforeSuite】测试套件开始初始化... (通常用于连接数据库或全局配置)
【BeforeClass】测试类开始初始化...
【BeforeMethod】测试开始...
--> 执行 testAdd
【AfterMethod】测试结束...
【BeforeMethod】测试开始...
--> 执行 testSubtract
【AfterMethod】测试结束...
【BeforeMethod】测试开始...
--> 执行 testDivideByZero
【AfterMethod】测试结束...
【AfterClass】测试类结束... (通常用于清理测试类实例)
【AfterSuite】测试套件结束... (通常用于清理全局数据)
3. 核心知识点总结
3.1 注解体系
@Test- 标记测试方法@BeforeSuite/@AfterSuite- 套件级别的生命周期@BeforeClass/@AfterClass- 类级别的生命周期@BeforeMethod/@AfterMethod- 方法级别的生命周期
3.2 断言机制
Assert.assertEquals()- 验证相等性Assert.assertTrue()/Assert.assertFalse()- 验证布尔条件- 断言失败时测试会立即停止并标记为失败
3.3 异常检测
expectedExceptions参数用于验证异常- 如果指定异常被抛出,测试通过
- 如果没有抛出异常或抛出不同类型的异常,测试失败
3.4 忽略测试
enabled = false用于临时禁用测试- 适用于功能尚未完成或暂时不需要运行的场景
4. 最佳实践
-
合理规划生命周期:
- 使用
@BeforeClass初始化测试环境 - 使用
@AfterClass清理资源 - 使用
@BeforeMethod/@AfterMethod重置测试数据
- 使用
-
命名规范:
- 测试方法使用
test前缀 - 方法名应该清晰表达测试目的
- 测试方法使用
-
断言策略:
- 每个测试方法至少包含一个断言
- 断言应该验证具体的行为而不是实现细节
-
异常测试:
- 验证所有可能的异常场景
- 使用具体的异常类型而不是通用的Exception
5. 下一步学习
掌握了TestNG的基础注解和生命周期后,下一步我们将学习:
- 参数化测试和DataProvider
- 测试分组策略
- 数据驱动测试
这些高级特性将让你能够构建更加灵活和强大的测试框架。
下一篇文章我们将深入探讨TestNG的数据驱动测试和分组策略,敬请期待!
#测试offer##自动化测试方案设计##测试开发##测试开发学习路线#
字节跳动成长空间 1005人发布