nunit测试常见三大卡点:测试类不被识别因缺nunit3testadapter或sdk类型错误;断言失败提示简陋因混用classic与constraint风格;参数化测试失效因testcase签名不匹配或类型不支持。

直接用 NUnit 写测试,最常卡在三件事上:测试类不被识别、断言失败没提示、参数化测试跑不起来。不是框架难,是默认约定和常见配置偏差太大。
为什么[TestFixture]加了还是找不到测试?
Visual Studio 或 dotnet test 找不到你的测试,大概率是缺了关键适配器或项目 SDK 类型不对。
-
NUnit本身只是断言和标记库,必须搭配NUnit3TestAdapter才能被测试运行器发现 - 测试项目 SDK 必须是
Microsoft.NET.Test.Sdk,不能是Microsoft.NET.Sdk(后者会编译成功但完全不识别[Test]) -
[TestFixture]类必须是public,且不能是static或嵌套在另一个类里 - 如果用了 .NET 6+ 的隐式 using,要确认是否引入了
NUnit.Framework,否则[Test]会标红但不报错
Assert.That(..., Is.EqualTo(...)) 为啥失败只报“False”?
这是 NUnit 经典的“断言风格陷阱”——你用了 Constraint 模式,但没启用详细输出,或者误用了 Classic 断言混搭。
- 避免写
Assert.IsTrue(actual == expected):它只告诉你True was false,不显示 actual 和 expected 值 - 坚持用
Assert.That(actual, Is.EqualTo(expected)):失败时自动打印 diff,包括字符串截断、浮点精度差异等 - 如果仍只看到模糊错误,检查是否引用了
NUnit.Framework.Constraints冲突版本,或项目里混用了Assert.AreEqual(Classic)和Assert.That(Constraint)两种风格 - 对集合比较,别用
Is.EqualTo,改用Is.EquivalentTo(忽略顺序)或Is.SubsetOf
[TestCase] 参数传进去,方法体里却收不到?
[TestCase] 不是“把值塞进变量”,而是靠方法签名严格匹配——参数类型、数量、顺序全得对上,否则静默跳过或报 InvalidCastException。
- 测试方法参数名可以任意,但类型和顺序必须和
[TestCase(1, "abc", true)]完全一致 - 不要在方法体内重新声明同名变量,比如
int a = 1;会覆盖传入的a - 若参数含
null、DateTime、枚举或自定义类型,[TestCase]不支持,得换[Theory]+[TestCaseSource] - 注意浮点数:写
[TestCase(0.1 + 0.2, 0.3)]会因精度失败,应改用Is.EqualTo(0.3).Within(0.001)
最易被忽略的是测试生命周期:NUnit 默认每个测试方法独享新实例,但 [SetUp] 和 [TearDown] 是实例级的——如果你在 [SetUp] 里 new 了一个 HttpClient 却没 Dispose,跑几十个测试后可能触发连接池耗尽,错误却显示在某个看似无关的断言上。










