跳到主要内容

C# 单元测试

介绍

单元测试是软件开发中的一种实践,用于验证代码的各个独立单元(通常是方法或函数)是否按预期工作。通过编写单元测试,开发者可以在早期阶段发现并修复错误,从而提高代码的质量和可维护性。

在 C# 中,单元测试通常使用 xUnitNUnitMSTest 等测试框架来编写。本文将使用 xUnit 作为示例框架。

为什么需要单元测试?

  • 提高代码质量:单元测试可以帮助你发现代码中的错误,确保代码按预期工作。
  • 简化调试:当测试失败时,你可以快速定位问题所在,而不必手动调试整个应用程序。
  • 支持重构:在重构代码时,单元测试可以确保现有功能不受影响。
  • 文档作用:单元测试可以作为代码的文档,帮助其他开发者理解代码的行为。

设置 xUnit 测试项目

首先,你需要创建一个新的 xUnit 测试项目。你可以使用 .NET CLI 来完成这个任务:

bash
dotnet new xunit -n MyFirstUnitTests

这将创建一个名为 MyFirstUnitTests 的 xUnit 测试项目。接下来,进入项目目录并添加对主项目的引用(假设你的主项目名为 MyApp):

bash
cd MyFirstUnitTests
dotnet add reference ../MyApp/MyApp.csproj

编写第一个单元测试

假设你有一个简单的 Calculator 类,其中包含一个 Add 方法:

csharp
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

现在,让我们为 Add 方法编写一个单元测试。在 MyFirstUnitTests 项目中,创建一个新的测试类 CalculatorTests

csharp
using Xunit;

public class CalculatorTests
{
[Fact]
public void Add_TwoNumbers_ReturnsSum()
{
// Arrange
var calculator = new Calculator();
int a = 5;
int b = 3;

// Act
int result = calculator.Add(a, b);

// Assert
Assert.Equal(8, result);
}
}

解释

  • Arrange:设置测试所需的初始条件。在这里,我们创建了一个 Calculator 实例,并定义了两个整数 ab
  • Act:执行要测试的操作。在这里,我们调用 Add 方法。
  • Assert:验证结果是否符合预期。在这里,我们使用 Assert.Equal 来检查 Add 方法的返回值是否等于 8

运行单元测试

你可以使用 .NET CLI 来运行单元测试:

bash
dotnet test

如果一切正常,你应该会看到类似以下的输出:

Test Run Successful.
Total tests: 1
Passed: 1
Total time: 1.2345 seconds

实际案例:测试异常

有时,你需要测试代码是否在特定情况下抛出异常。例如,假设 Calculator 类有一个 Divide 方法,当除数为零时抛出 DivideByZeroException

csharp
public class Calculator
{
public int Divide(int a, int b)
{
if (b == 0)
{
throw new DivideByZeroException("Cannot divide by zero.");
}
return a / b;
}
}

你可以编写一个单元测试来验证这一点:

csharp
[Fact]
public void Divide_ByZero_ThrowsDivideByZeroException()
{
// Arrange
var calculator = new Calculator();
int a = 10;
int b = 0;

// Act & Assert
var exception = Assert.Throws<DivideByZeroException>(() => calculator.Divide(a, b));
Assert.Equal("Cannot divide by zero.", exception.Message);
}

解释

  • Assert.Throws:用于验证代码是否抛出了预期的异常。如果代码没有抛出异常,测试将失败。

总结

单元测试是确保代码质量的重要工具。通过编写单元测试,你可以更自信地修改和扩展代码,而不必担心引入新的错误。本文介绍了如何使用 xUnit 编写简单的单元测试,并展示了如何测试异常情况。

附加资源

练习

  1. Calculator 类编写更多的单元测试,例如测试 SubtractMultiply 方法。
  2. 尝试为你的项目中的其他类编写单元测试。
  3. 研究如何使用 Moq 框架来模拟依赖项,以便进行更复杂的单元测试。