C# 测试:单元测试、集成测试、端到端测试从入门到精通

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为何测试不是奢侈品,而是必需品



在现代 C# (.NET) 开发领域,代码质量不仅决定产品发布速度,更关乎产品声誉。生产环境中的错误、依赖更新后的突发崩溃、或业务逻辑行为异常,这些场景都可以通过结构良好的测试来避免。



许多开发者(尤其是初学者)将测试视为"额外工作"。然而在实践中,测试能节省数小时的调试与重构时间。本文将深入解析 C# 生态系统中的三个关键测试层级:单元测试、集成测试和端到端测试。您将了解每个层级如何解决特定任务、应使用哪些工具,以及如何编写清晰且易于维护的测试。



1. 单元测试:质量的基石



单元测试用于检查隔离的代码块(通常是单个方法或类),并将其与外部依赖项完全隔离。在 C# 中,这是最快且最稳定的测试层级。主要目标是确保每个函数在各种输入数据下都能正确运行。



C# 单元测试工具



.NET 最流行的框架是 xUnit(微软推荐)和 NUnit。依赖项模拟方面,通常使用 Moq 库或 .NET 内置的 FakeItEasy。



单元测试示例 (xUnit + Moq)



假设我们有一个折扣计算服务,它依赖于用户仓库:



public class DiscountService{    private readonly IUserRepository _userRepo;

public DiscountService(IUserRepository userRepo) { _userRepo = userRepo; }

public decimal CalculateDiscount(int userId, decimal orderTotal) { var user = _userRepo.GetById(userId); if (user.IsVip) return orderTotal * 0.2m; // 20% 折扣 return orderTotal * 0.05m; // 5% 折扣 }}


针对该方法的测试:



public class DiscountServiceTests{    [Fact]    public void CalculateDiscount_WhenUserIsVip_Returns20Percent()    {        // 准备        var mockRepo = new Mock<IUserRepository>();        mockRepo.Setup(repo => repo.GetById(1))                .Returns(new User { Id = 1, IsVip = true });        var service = new DiscountService(mockRepo.Object);

// 执行 var result = service.CalculateDiscount(1, 100m);

// 断言 Assert.Equal(20m, result); }}


重要提示:单元测试中不会访问真实数据库,而是通过模拟对象来隔离 DiscountService 的逻辑。



2. 集成测试:验证组件交互



集成测试用于检查多个真实组件(如数据库、API、文件系统)之间的交互。在 .NET 中,通常使用 WebApplicationFactory(适用于 ASP.NET Core)和测试容器(Testcontainers)来完成。



集成测试的特点



  • 比单元测试慢 —— 需要搭建基础设施(数据库、HTTP 服务器)。
  • 维护成本更高 —— 需要管理测试环境的状态。
  • 价值 —— 能够发现配置、数据映射以及与真实数据库交互时的问题。


集成测试示例 (ASP.NET Core + xUnit)



假设我们有一个处理订单的控制器。该测试将验证对真实 API 的请求是否返回正确的 JSON:



public class OrdersApiTests : IClassFixture<WebApplicationFactory<Program>>{    private readonly HttpClient _client;

public OrdersApiTests(WebApplicationFactory<Program> factory) { _client = f

博客

书籍推荐