C# NUnit测试框架方法 C#如何使用NUnit编写测试用例

来源:这里教程网 时间:2026-02-21 17:39:45 作者:

NUnit 不是内置框架,必须通过 NuGet 显式安装才能使用;直接写

[Test]
会编译失败或测试不被识别。

如何正确安装并启用 NUnit 支持

VS 中新建项目后,默认不含 NUnit 运行时和断言库。需手动添加两个关键包:

NUnit
:提供
[Test]
[SetUp]
、断言类(如
Assert.AreEqual
)等核心类型
NUnit3TestAdapter
:让 Visual Studio 测试探索器能发现并执行 NUnit 测试方法

推荐用 Package Manager Console 执行:

Install-Package NUnit<br>Install-Package NUnit3TestAdapter

若用 .NET SDK 风格项目(.csproj 含

<packagereference></packagereference>
),确保两者版本兼容——例如 NUnit 3.13+ 对应 NUnit3TestAdapter 4.x;混用 NUnit 4 和旧版 Adapter 会导致测试不显示。

测试类和方法的必要修饰规则

NUnit 要求测试代码满足严格结构,否则测试发现器直接忽略:

测试类必须是 public,且不能是
static
测试方法必须是 publicvoid(或
Task
用于异步)、无参数
必须标记
[Test]
;若想按条件跳过,用
[Ignore("原因")]
,不是注释掉方法
避免在类名或方法名中使用空格或特殊字符,VS 测试窗口可能显示异常

错误示例(不会被识别):

internal class CalculatorTests {<br>  private void Add_TwoNumbers_ReturnsSum() { ... } // ❌ 非 public + 无 [Test]<br>}

正确写法:

public class CalculatorTests<br>{<br>    [Test]<br>    public void Add_TwoNumbers_ReturnsSum()<br>    {<br>        var result = new Calculator().Add(2, 3);<br>        Assert.AreEqual(5, result);<br>    }<br>}

常见断言写法与易错点

Assert
是 NUnit 的核心验证机制,不同断言语义差异大,选错会导致误报或漏报:

Assert.AreEqual(expected, actual)
:适用于值类型、字符串、实现了
IEquatable<t></t>
的类型;对引用类型默认比较引用而非内容
Assert.That(actual, Is.EqualTo(expected))
:更灵活,支持链式约束(如
Is.Not.Null.And.Length.EqualTo(5)
),但性能略低
Assert.Throws<argumentexception>(() => method())</argumentexception>
:捕获异常,注意必须传委托,不能写
method()
(会先执行再传返回值)
浮点数比较慎用
AreEqual
,改用
AreApproximatelyEqual(expected, actual, delta)
Is.EqualTo(expected).Within(delta)

典型陷阱:

Assert.AreEqual(new List<int>{1,2}, new List<int>{1,2})</int></int>
永远失败——因为
List<t></t>
未重载
Equals
,比较的是引用。

测试生命周期控制:SetUp/TearDown 不等于构造/析构

[SetUp]
[TearDown]
在每个
[Test]
方法前后运行,但它们不控制对象生命周期:

每次测试都会新建测试类实例,所以字段初始化可在构造函数中做,但
[SetUp]
更适合重置共享状态(如 mock 行为、数据库连接)
[OneTimeSetUp]
[OneTimeTearDown]
在整个测试类所有方法执行前后各运行一次,适合开销大的全局准备(如启动测试服务器)
不要在
[TearDown]
中释放
IDisposable
字段后继续在后续测试中使用它——NUnit 不保证字段是否被 GC 回收,重复使用可能引发
ObjectDisposedException

真正容易被忽略的是:如果

[SetUp]
抛异常,对应测试不会运行,但
[TearDown]
仍会执行(前提是 SetUp 成功完成)。这个行为和多数人直觉相反。

相关推荐