TestNG入门(一):基础注解与生命周期管理

大家好我是NBA球星伦纳德, 以后持续在牛客分享自己的学习笔记!欢迎大家关注 接下来大家带来TestNG的入门学习, 计划分为四期内容介绍!

TestNG入门(一):基础注解与生命周期管理

1. TestNG简介

TestNG(Test Next Generation)是一个强大的Java测试框架,专为简化广泛的测试需求而设计。它是JUnit的继承者,但引入了许多新功能,使得测试更加灵活和强大。

1.1 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的生命周期注解按照以下顺序执行:

  1. @BeforeSuite - 整个测试套件开始前执行一次
  2. @BeforeClass - 当前测试类开始前执行一次
  3. @BeforeMethod - 每个测试方法执行前都会执行
  4. @Test - 实际的测试方法
  5. @AfterMethod - 每个测试方法执行后都会执行
  6. @AfterClass - 当前测试类结束后执行一次
  7. @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. 最佳实践

  1. 合理规划生命周期

    • 使用@BeforeClass初始化测试环境
    • 使用@AfterClass清理资源
    • 使用@BeforeMethod/@AfterMethod重置测试数据
  2. 命名规范

    • 测试方法使用test前缀
    • 方法名应该清晰表达测试目的
  3. 断言策略

    • 每个测试方法至少包含一个断言
    • 断言应该验证具体的行为而不是实现细节
  4. 异常测试

    • 验证所有可能的异常场景
    • 使用具体的异常类型而不是通用的Exception

5. 下一步学习

掌握了TestNG的基础注解和生命周期后,下一步我们将学习:

  • 参数化测试和DataProvider
  • 测试分组策略
  • 数据驱动测试

这些高级特性将让你能够构建更加灵活和强大的测试框架。

下一篇文章我们将深入探讨TestNG的数据驱动测试和分组策略,敬请期待!

#测试offer##自动化测试方案设计##测试开发##测试开发学习路线#
全部评论
你在美团?
点赞 回复 分享
发布于 今天 12:03 北京

相关推荐

马上就好了:HR看了以为来卧底来了
点赞 评论 收藏
分享
程序员小白条:这还能没面试?不过简历确实不像国内写的简历
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务