Eureka 的简单使用笔记
TestNG 核心概念详解
🧬 1. TestNG 生命周期
TestNG 的生命周期由一系列注解驱动,它们按照特定的顺序执行,用于测试前的环境准备、测试后的资源清理以及测试逻辑本身的执行。
执行层级与顺序
TestNG 的注解遵循从宏观到微观的执行顺序:
1.1 BeforeSuite / AfterSuite
- 作用域:整个测试套件(
<suite>) - 执行时机:在所有测试开始之前执行一次,或在所有测试结束之后执行一次
- 用途:通常用于全局资源的初始化(如启动数据库服务)或生成最终的测试报告
1.2 BeforeTest / AfterTest
- 作用域:测试组(
<test>) - 执行时机:在
<test>标签包含的所有类运行之前或之后执行 - 用途:适用于针对特定测试模块的配置
1.3 BeforeGroups / AfterGroups
- 作用域:测试组(Group)
- 执行时机:在属于指定组的第一个测试方法运行之前,或该组的最后一个测试方法运行之后执行
- 用途:用于配置特定业务逻辑组的上下文
1.4 BeforeClass / AfterClass
- 作用域:当前测试类
- 执行时机:在当前类的第一个测试方法运行之前,或所有测试方法运行之后执行
- 用途:常用于初始化当前类的静态变量或共享对象
1.5 BeforeMethod / AfterMethod
- 作用域:单个测试方法
- 执行时机:在每个
@Test方法运行之前或之后执行 - 用途:最常用的配置,用于重置数据、关闭浏览器窗口或清理临时文件,确保每个测试用例的独立性
1.6 Test
- 作用域:测试逻辑本身
- 用途:标记为具体的测试用例入口
⚙️ 2. 配置文件 (testng.xml)
testng.xml 是 TestNG 的指挥中心,它不编写测试逻辑,而是定义”如何运行”这些测试。
2.1 核心结构
Suite (套件)
- 根节点,代表一个完整的测试流程
- 可以配置并行执行模式(
parallel)和线程数(thread-count) - 用于实现多线程并发测试
Test (测试)
- Suite 的子集,用于将测试类分组
- 一个 Suite 可以包含多个 Test 块
Groups (组)
- 用于对测试方法进行逻辑分类(如
smoke,regression) - 可以在 XML 中灵活地指定只运行某些组,或者排除某些组
Classes (类)
- 指定具体要运行的 Java 类
Methods (方法)
- 精确控制类中哪些方法需要运行
- 支持
include(包含)和exclude(排除)
Parameters (参数)
- 允许在 XML 中定义键值对
- 传递给 Java 代码中的
@Parameters注解 - 实现测试数据与代码的分离
✅ 3. 断言 (Assertions)
断言是自动化测试的”裁判”,用于验证实际结果是否符合预期结果。
3.1 硬断言
机制
一旦断言失败(例如 assertEquals 不匹配),立即抛出异常并终止当前测试方法的执行。
常用类型
assertEquals(actual, expected):验证相等性assertTrue(condition):验证条件为真assertFalse(condition):验证条件为假assertNotNull(object):验证对象非空
3.2 软断言
机制
当断言失败时,不会立即中断测试,而是记录错误并继续执行后续步骤。
汇总
必须在测试结束前调用 assertAll() 方法,该方法会统一汇报所有收集到的断言失败信息。
场景
适用于需要在一次测试中验证多个独立字段(如表单验证)的场景。
💉 4. 依赖注入
TestNG 支持通过依赖注入的方式,将运行时对象自动传递给测试方法或配置方法的参数中,无需手动实例化。
4.1 本机注入
TestNG 原生支持注入以下对象:
ITestContext
- 提供当前测试上下文的完整信息
- 可用于在不同测试方法间共享数据
ITestResult
- 仅在
@AfterMethod中使用 - 反映刚刚执行的测试结果是成功还是失败
XmlTest
- 对应
testng.xml中的<test>标签 - 可获取该测试块的属性
Method
- 反射对象,代表即将运行或刚刚运行过的测试方法
4.2 外部注入
TestNG 可以与第三方依赖注入框架(如 Guice)集成,通过 @Guice 注解来管理复杂的对象依赖关系。
🏭 5. @Factory 注解
@Factory 是一种高级特性,用于在运行时动态创建测试类的实例。
5.1 核心功能
动态实例化
- 被
@Factory注解的方法必须返回一个Object[]数组 - 数组中的每个元素都是一个测试类的实例
多实例执行
TestNG 会为数组中的每一个实例分别运行其内部所有的 @Test 方法。
5.2 应用场景
数据驱动
当你需要使用不同的数据集初始化同一个测试类,并希望每种数据都作为一个独立的测试实体运行时,使用 @Factory 最为合适。
与 DataProvider 的区别
- @DataProvider:针对同一个实例重复运行同一个测试方法
- @Factory:创建多个实例,每个实例运行其所有测试方法
📌 总结
TestNG 作为一个功能强大的测试框架,通过其灵活的生命周期管理、配置文件支持、丰富的断言机制、依赖注入功能以及动态实例化能力,为自动化测试提供了全面的解决方案。理解这些核心概念有助于更好地设计和维护测试套件,提高测试效率和质量。
