单元测试之Arrange-Act-Assert(简称AAA)

Arrange-Act-Assert(简称AAA)是一种编写单元测试的标准模式,具有清晰的结构和明确的步骤,有助于提高测试的可读性、可维护性和可扩展性。以下是对每个步骤的详细说明:

1. Arrange(准备阶段)

在这一阶段,你需要设置测试所需的环境,包括但不限于:

  • 初始化被测对象。
  • 创建模拟对象或存根(如果需要的话)。
  • 设置输入数据或配置被测对象的状态。

示例:

cs 复制代码
// 创建并配置模拟对象
var mockRepository = Substitute.For<IRepository>();
mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true);

// 初始化被测对象
var orderService = new OrderService(mockRepository);

2. Act(执行阶段)

这是测试的核心部分,在这里你调用被测对象的方法或执行你想要验证的行为。这个步骤应该是直接且单一的,理想情况下只包含一个动作。

示例:

cs 复制代码
// 调用被测方法
var result = orderService.ProcessOrder(new Order { Id = 1, Description = "Test Order" });

3. Assert(断言阶段)

在最后一步中,你将验证执行阶段的结果是否符合预期。这可能包括检查返回值、状态变化或确认某些行为(如方法调用)确实发生了。

示例:

cs 复制代码
// 验证结果
Assert.Equal("Order saved successfully!", result);
mockRepository.Received().SaveOrder(Arg.Any<Order>()); // 确认 SaveOrder 方法被调用

完整示例

结合上述各部分,这里有一个完整的使用 Arrange-Act-Assert 模式的单元测试示例:

cs 复制代码
using NSubstitute;
using Xunit;

public class OrderServiceTests
{
    [Fact]
    public void ProcessOrder_ShouldReturnSuccess_WhenSaveOrderSucceeds()
    {
        // Arrange
        var mockRepository = Substitute.For<IRepository>();
        mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true); // 准备:设置模拟对象行为

        var orderService = new OrderService(mockRepository); // 准备:初始化被测对象
        var testOrder = new Order { Id = 1, Description = "Test Order" }; // 准备:设置输入数据

        // Act
        var result = orderService.ProcessOrder(testOrder); // 执行:调用被测方法

        // Assert
        Assert.Equal("Order saved successfully!", result); // 断言:验证返回值
        mockRepository.Received().SaveOrder(testOrder); // 断言:验证 SaveOrder 方法被调用
    }
}

通过遵循 AAA 模式,你的测试会变得更加结构化和清晰,不仅有助于你自己理解和维护代码,也能让其他开发者更容易地阅读和贡献代码。

相关推荐
一晌小贪欢21 小时前
Python 测试利器:使用 pytest 高效编写和管理单元测试
python·单元测试·pytest·python3·python测试
汽车仪器仪表相关领域1 天前
MTX-A 模拟废气温度(EGT)计 核心特性与车载实操指南
网络·人工智能·功能测试·单元测试·汽车·可用性测试
卓码软件测评1 天前
第三方软件课题验收测试【使用Docker容器部署LoadRunner负载生成器以实现弹性压测 】
测试工具·docker·容器·性能优化·单元测试·测试用例
Apifox.2 天前
Apifox 1 月更新|MCP 调试、测试套件、测试报告重构、网络信息查看、Hoppscotch 导入
前端·人工智能·测试工具·单元测试·团队开发
卓码软件测评2 天前
第三方移动应用测试机构:【移动应用性能测试:使用LoadRunner的Mobile Application - HTTP/HTML协议】
测试工具·ci/cd·性能优化·单元测试·测试用例
汽车仪器仪表相关领域2 天前
70A大电流+三档电压可调:Midtronics MSP-070系列电源充电器汽车ECU刷新与电池维护实战全解
人工智能·功能测试·单元测试·汽车·可用性测试
我送炭你添花2 天前
Pelco KBD300A 模拟器:18. 按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试
python·单元测试·log4j·pytest
CodeCraft Studio2 天前
Parasoft是什么?Parasoft自动化测试工具与解决方案:实现规模化应用
自动化测试·测试工具·单元测试·静态测试·parasoft·嵌入式软件测试·软件安全合规
卓码软件测评2 天前
【第三方双重资质软件测试机构:测试RESTful API和SOAP Web Services:LoadRunner协议选择和脚本编写】
测试工具·ci/cd·性能优化·单元测试·测试用例·restful
别会,会就是不问2 天前
Junit4下Mockito包的使用
java·junit·单元测试