NUnit测试需安装NUnit3TestAdapter适配器才能被VS识别,测试类须public非static、方法public void无参带[Test],异步测试必须用async Task签名,Assert失败需启用PDB调试符号并避免try/catch吞异常。

NUnit 不是“装上就能跑”的测试框架,C# 项目里直接引用 NUnit 包但不配 NUnit3TestAdapter,VS 或 CLI 根本发现不了你的测试方法——这是最常卡住人的第一步。
怎么让 Visual Studio 看见你的 NUnit 测试
VS 默认只识别 MSTest 的 [TestMethod],对 NUnit 的 [Test] 完全无视,除非装对适配器:
- 用 NuGet 安装
NUnit3TestAdapter(不是NUnit本身!)到测试项目,版本必须和NUnit主包兼容(例如NUnit 3.13.3对应NUnit3TestAdapter 4.5.0) - 项目 SDK 类型要是
Microsoft.NET.Sdk(.NET Core/.NET 5+ 项目默认满足),老式.csproj需手动加<packagereference></packagereference>并确认OutputType是Library - 测试类必须是
public,且不能是static;方法必须是public void返回类型,无参数,带[Test]或[TestCase] - 如果用了
[TestFixture],它只是可选装饰,不加也不影响发现,但加了能明确标记测试容器
Assert 失败时为什么没报具体哪行?
常见现象:断言失败只显示 Expected: 42, But was: 0,却看不到是 Assert.AreEqual(42, result) 这行出的问题。根本原因是没启用调试符号或测试运行器未加载 PDB:
- 确保测试项目生成配置为
Debug,且GenerateFullPdb为true(新 SDK 项目默认开启) - 不要在测试方法里用
try/catch吞掉异常——Assert抛的是AssertionException,捕获后不重抛就丢失堆栈 - 优先用语义化断言,比如
Assert.That(actual, Is.EqualTo(expected))比Assert.AreEqual提供更清晰的失败消息 - 自定义消息可用
Assert.That(actual, Is.EqualTo(expected), "计算总价时未包含税费")
异步测试(async Task)总提示“不支持”
NUnit 3.0+ 原生支持 async 测试,但写法有硬性约束:
- 测试方法签名必须是
public async Task,不能是async void(后者无法等待,直接被当成同步方法执行) - 不要在
[SetUp]或[TearDown]里写 async 方法——NUnit 不支持,得改用同步逻辑或把异步初始化移到测试方法内部 - 验证异步行为时,避免用
.Result或.Wait(),会引发死锁;直接 await 被测方法,再对返回值做断言 - 示例:
[Test] public async Task LoadUserById_ReturnsUser_WhenExists() { var user = await _service.LoadUserById(123); Assert.That(user, Is.Not.Null); }
真正容易被忽略的点:NUnit 的生命周期([SetUp]/[TearDown])和并行策略([Parallelizable])在大型测试集里会显著影响稳定性——比如共享静态状态的测试同时跑,结果不可预测,但这点很少在入门文档里被强调。


















