基于NUnit 4.2与.NET 8,如何扩展Assert.That及验证断言成功?
在NUnit 4.2 + .NET 8中扩展断言以记录成功状态
场景背景
你在使用NUnit 4.2和.NET 8时,需要在单个测试方法的大量断言中,不仅在失败时输出自定义信息,还要在成功时记录日志,以便CI流水线追踪每个断言的执行情况,且无法将断言拆分为多个测试方法。
问题1:如何为Assert.That扩展新参数?
NUnit的Assert是静态类,无法直接扩展其现有方法的参数,但可以通过封装自定义断言类来实现需求,添加自定义的成功描述参数,并在内部调用原生NUnit断言逻辑。
自定义断言类示例
using NUnit.Framework; using NUnit.Framework.Constraints; public static class CustomAssert { // 重载适配常用的断言场景 public static void That<T>(T actual, IResolveConstraint constraint, string failureMessage = null, string successDescription = null) { // 先记录当前已有的失败断言数 int initialFailedCount = TestContext.CurrentContext.AssertionResults.Count(result => !result.IsSuccess); // 执行原生NUnit断言 Assert.That(actual, constraint, failureMessage); // 判断断言是否成功(失败数未增加则表示成功) int currentFailedCount = TestContext.CurrentContext.AssertionResults.Count(result => !result.IsSuccess); if (initialFailedCount == currentFailedCount && !string.IsNullOrEmpty(successDescription)) { TestContext.Out.WriteLine($"✅ Assertion passed: {successDescription}"); } } // 可根据需要添加更多重载(比如无failureMessage的版本) public static void That<T>(T actual, IResolveConstraint constraint, string successDescription) { That(actual, constraint, null, successDescription); } }
使用方式
在测试方法中替换原生Assert.That为自定义的CustomAssert.That,传入成功描述参数:
[Test] public void Add_Two_Numbers() { int a = 2, b = 3, c = 4, d = 5; int resultAB = a + b; int resultCD = c + d; Assert.Multiple(() => { CustomAssert.That(resultAB, Is.EqualTo(5), failureMessage: "Somehow it's not 5", successDescription: $"Checking if {a}+{b} equals 5"); CustomAssert.That(resultCD, Is.EqualTo(9), failureMessage: "Somehow it's not 9", successDescription: $"Checking if {c}+{d} equals 9"); }); }
问题2:如何验证断言是否成功(特别是在Assert.Multiple作用域内)?
Assert.Multiple会捕获所有断言异常,不会立即终止执行,因此无法通过常规的try/catch判断断言是否成功。解决方案是利用NUnit提供的TestContext.CurrentContext.AssertionResults集合,通过对比断言执行前后的失败断言数量来判断当前断言的状态:
- 执行断言前,统计集合中失败断言的数量;
- 执行原生断言后,再次统计失败断言数量;
- 如果两次数量相等,说明当前断言执行成功;如果数量增加,则断言失败。
这种方式既适配普通断言场景,也完全兼容Assert.Multiple的批量断言逻辑,能准确追踪每个断言的执行结果。
内容的提问来源于stack exchange,提问作者col-A
相关产品推荐
相关产品推荐

