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
最流行的模