C# (.NET) 测试:框架与工具全面概述

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

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

开始课程

C# (.NET) 中的测试:框架与工具



测试是 .NET 平台上专业开发不可或缺的一部分。高质量的代码测试覆盖可以减少错误数量,简化重构过程,并提升对产品的信心。在 C# 生态系统中,存在许多成熟的框架和工具,每个都解决特定的任务:从单元测试到集成测试和 UI 测试。在本文中,我们将分析主要工具、它们的功能以及使用示例。



单元测试的主要框架



单元测试是测试金字塔的基础。在 .NET Core / .NET 5+ 中,事实上的标准是 xUnit.net,尽管 NUnit 和 MSTest 也被广泛使用。



xUnit.net

现代、灵活且最流行的框架。它基于"事实"和"理论"的原则工作。

  • 事实 (Fact) — 不带参数的简单测试。
  • 理论 (Theory) — 参数化测试,数据来自 [InlineData] 或 [MemberData] 属性。
  • 不需要 [TestClass] 属性 — 任何公共类都可以包含测试。
using Xunit;

public class CalculatorTests{ [Fact] public void Add_ShouldReturnSum() { // Arrange var calc = new Calculator(); // Act var result = calc.Add(2, 3); // Assert Assert.Equal(5, result); }

[Theory] [InlineData(1, 2, 3)] [InlineData(-1, -1, -2)] public void Add_WithMultipleInputs_ShouldReturnCorrectSum(int a, int b, int expected) { var calc = new Calculator(); var result = calc.Add(a, b); Assert.Equal(expected, result); }}


NUnit

具有悠久历史的经典框架。以其强大的属性和参数化支持而著称。

  • 使用 [Test]、[TestCase]、[SetUp] 属性。
  • 支持并行测试执行。
  • 适用于具有测试数据的复杂场景。
using NUnit.Framework;

[TestFixture]public class CalculatorNUnitTests{ [Test] public void Subtract_ShouldReturnDifference() { var calc = new Calculator(); var result = calc.Subtract(10, 4); Assert.That(result, Is.EqualTo(6)); }

[TestCase(5, 3, 2)] [TestCase(0, 0, 0)] public void Subtract_WithParameters_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.That(calc.Subtract(a, b), Is.EqualTo(expected)); }}


MSTest

微软内置的框架。非常适合在 Visual Studio 生态系统中工作的简单项目和团队。

  • 属性:[TestMethod]、[TestClass]、[DataRow]。
  • 与 Azure DevOps 和 CI/CD 流水线紧密集成。
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]public class CalculatorMSTests{ [TestMethod] public void Multiply_ShouldReturnProduct() { var calc = new Calculator(); var result = calc.Multiply(4, 5); Assert.AreEqual(20, result); }

[DataRow(2, 3, 6)] [DataRow(0, 100, 0)] [DataTestMethod] public void Multiply_WithDataRows_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.AreEqual(expected, calc.Multiply(a, b)); }}


用于模拟对象和隔离的库

在单元测试中,通常需要将测试代码与外部依赖项(数据库、API、文件系统)隔离开来。为此,使用模拟框架。



Moq

最流行的模

推荐