NUnit需通过NuGet安装NUnit和NUnit3TestAdapter包;测试类须public非static,方法须public void且标记[Test];断言慎用AreEqual比较引用类型,浮点数用ApproximatelyEqual;[SetUp]/[TearDown]控制每测试前后,[OneTimeSetUp]/[OneTimeTearDown]控制全类前后。

NUnit 不是内置框架,必须通过 NuGet 显式安装才能使用;直接写 [Test] 会编译失败或测试不被识别。
如何正确安装并启用 NUnit 支持
VS 中新建项目后,默认不含 NUnit 运行时和断言库。需手动添加两个关键包:
-
NUnit:提供[Test]、[SetUp]、断言类(如Assert.AreEqual)等核心类型 -
NUnit3TestAdapter:让 Visual Studio 测试探索器能发现并执行 NUnit 测试方法
推荐用 Package Manager Console 执行:
Install-Package NUnit
Install-Package NUnit3TestAdapter
若用 .NET SDK 风格项目(.csproj 含 ),确保两者版本兼容——例如 NUnit 3.13+ 对应 NUnit3TestAdapter 4.x;混用 NUnit 4 和旧版 Adapter 会导致测试不显示。
测试类和方法的必要修饰规则
NUnit 要求测试代码满足严格结构,否则测试发现器直接忽略:
- 测试类必须是 public,且不能是
static - 测试方法必须是 public、void(或
Task用于异步)、无参数 - 必须标记
[Test];若想按条件跳过,用[Ignore("原因")],不是注释掉方法 - 避免在类名或方法名中使用空格或特殊字符,VS 测试窗口可能显示异常
错误示例(不会被识别):
internal class CalculatorTests {
private void Add_TwoNumbers_ReturnsSum() { ... } // ❌ 非 public + 无 [Test]
}
正确写法:
public class CalculatorTests
{
[Test]
public void Add_TwoNumbers_ReturnsSum()
{
var result = new Calculator().Add(2, 3);
Assert.AreEqual(5, result);
}
}
常见断言写法与易错点
Assert 是 NUnit 的核心验证机制,不同断言语义差异大,选错会导致误报或漏报:
-
Assert.AreEqual(expected, actual):适用于值类型、字符串、实现了IEquatable的类型;对引用类型默认比较引用而非内容 -
Assert.That(actual, Is.EqualTo(expected)):更灵活,支持链式约束(如Is.Not.Null.And.Length.EqualTo(5)),但性能略低 -
Assert.Throws:捕获异常,注意必须传委托,不能写(() => method()) method()(会先执行再传返回值) - 浮点数比较慎用
AreEqual,改用AreApproximatelyEqual(expected, actual, delta)或Is.EqualTo(expected).Within(delta)
典型陷阱:Assert.AreEqual(new List 永远失败——因为 List 未重载 Equals,比较的是引用。
测试生命周期控制:SetUp/TearDown 不等于构造/析构
[SetUp] 和 [TearDown] 在每个 [Test] 方法前后运行,但它们不控制对象生命周期:
- 每次测试都会新建测试类实例,所以字段初始化可在构造函数中做,但
[SetUp]更适合重置共享状态(如 mock 行为、数据库连接) -
[OneTimeSetUp]和[OneTimeTearDown]在整个测试类所有方法执行前后各运行一次,适合开销大的全局准备(如启动测试服务器) - 不要在
[TearDown]中释放IDisposable字段后继续在后续测试中使用它——NUnit 不保证字段是否被 GC 回收,重复使用可能引发ObjectDisposedException
真正容易被忽略的是:如果 [SetUp] 抛异常,对应测试不会运行,但 [TearDown] 仍会执行(前提是 SetUp 成功完成)。这个行为和多数人直觉相反。










