# learn-testng **Repository Path**: jin-yang-0079/learn-testng ## Basic Information - **Project Name**: learn-testng - **Description**: TestNG 学习笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-16 - **Last Updated**: 2026-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TestNG 核心概念详解 ## 🧬 1. TestNG 生命周期 TestNG 的生命周期由一系列注解驱动,它们按照特定的顺序执行,用于测试前的环境准备、测试后的资源清理以及测试逻辑本身的执行。 ### 执行层级与顺序 TestNG 的注解遵循从宏观到微观的执行顺序: #### 1.1 BeforeSuite / AfterSuite - **作用域**:整个测试套件(``) - **执行时机**:在所有测试开始之前执行一次,或在所有测试结束之后执行一次 - **用途**:通常用于全局资源的初始化(如启动数据库服务)或生成最终的测试报告 #### 1.2 BeforeTest / AfterTest - **作用域**:测试组(``) - **执行时机**:在 `` 标签包含的所有类运行之前或之后执行 - **用途**:适用于针对特定测试模块的配置 #### 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` 中的 `` 标签 - 可获取该测试块的属性 #### Method - 反射对象,代表即将运行或刚刚运行过的测试方法 ### 4.2 外部注入 TestNG 可以与第三方依赖注入框架(如 Guice)集成,通过 `@Guice` 注解来管理复杂的对象依赖关系。 --- ## 🏭 5. @Factory 注解 `@Factory` 是一种高级特性,用于在运行时动态创建测试类的实例。 ### 5.1 核心功能 #### 动态实例化 - 被 `@Factory` 注解的方法必须返回一个 `Object[]` 数组 - 数组中的每个元素都是一个测试类的实例 #### 多实例执行 TestNG 会为数组中的每一个实例分别运行其内部所有的 `@Test` 方法。 ### 5.2 应用场景 #### 数据驱动 当你需要使用不同的数据集初始化同一个测试类,并希望每种数据都作为一个独立的测试实体运行时,使用 `@Factory` 最为合适。 #### 与 DataProvider 的区别 - **@DataProvider**:针对同一个实例重复运行同一个测试方法 - **@Factory**:创建多个实例,每个实例运行其所有测试方法 --- ## 📌 总结 TestNG 作为一个功能强大的测试框架,通过其灵活的生命周期管理、配置文件支持、丰富的断言机制、依赖注入功能以及动态实例化能力,为自动化测试提供了全面的解决方案。理解这些核心概念有助于更好地设计和维护测试套件,提高测试效率和质量。