C# 测试:.NET 项目的单元测试、集成测试和端到端测试

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

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

开始课程

C# 中的测试:单元测试、集成测试与端到端测试 — .NET 开发人员完整指南



软件质量始于测试。在 C# (.NET) 生态系统中,存在一种成熟的测试文化,包含三个关键层级:单元测试、集成测试和端到端测试。在本文中,我们将通过实际示例剖析每个层级,展示最佳库,并解释如何为您的 .NET 项目构建有效的测试策略。



1. C# 中的单元测试:代码质量的基础



单元测试 在隔离外部依赖的情况下,验证独立程序组件(方法、类、函数)的操作。在 .NET 中,主要框架是 xUnit、NUnit 和 MSTest。最受欢迎的是 xUnit,因为它具有灵活性和与 .NET Core 的集成能力。



单元测试库:

  • xUnit — 主要框架(Microsoft 推荐)
  • Moq — 创建用于依赖隔离的模拟对象
  • FluentAssertions — 改进的断言表达式
  • AutoFixture — 自动测试数据生成


使用 xUnit 和 Moq 的单元测试示例:



using Xunit;using Moq;using FluentAssertions;

public class OrderServiceTests{ [Fact] public void CalculateTotal_WithValidItems_ReturnsCorrectSum() { // Arrange var mockRepo = new Mock<IProductRepository>(); mockRepo.Setup(r => r.GetPrice(1)).Returns(100m); mockRepo.Setup(r => r.GetPrice(2)).Returns(50m);

var service = new OrderService(mockRepo.Object); var items = new List<OrderItem> { new OrderItem { ProductId = 1, Quantity = 2 }, new OrderItem { ProductId = 2, Quantity = 1 } };

// Act var total = service.CalculateTotal(items);

// Assert total.Should().Be(250m); mockRepo.Verify(r => r.GetPrice(1), Times.Once); mockRepo.Verify(r => r.GetPrice(2), Times.Once); }}


单元测试技巧:

  • 遵循 AAA 模式(Arrange, Act, Assert)
  • 一个测试 — 一个检查(一个断言)
  • 使用带 [InlineData] 的 [Theory] 进行参数化
  • 不要测试外部服务 — 使用模拟对象


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



集成测试 验证不同系统模块如何协同工作:数据库、文件系统、外部 API。与单元测试不同,这里我们使用真实或接近真实的依赖项。



.NET 中的集成测试工具:

  • Microsoft.AspNetCore.TestHost — 可嵌入的 Web 服务器
  • TestContainers — 数据库容器化(PostgreSQL, SQL Server, Redis)
  • Respawn — 测试间数据库清理
  • WebApplicationFactory<T> — 创建测试主机


使用 TestContainers 和 WebApplicationFactory 的集成测试示例:



using Microsoft.AspNetCore.Mvc.Testing;using Testcontainers.PostgreSql;using Xunit;

public class UserApiIntegrationTests : IAsyncLifetime{ private readonly PostgreSqlContainer _dbContainer; private WebApplicationFactory<Program> _factory;

public UserApiIntegrationTests() { _dbContainer = new PostgreSqlBuilder() .WithImage("postgres:15") .WithDatabase("testdb") .WithUsername("tes

博客

书籍推荐