如何获取NUnit测试执行失败时对应的C#测试对象/数据参数值?
解决方案
下面是可直接落地的4种实现方式,可根据你的需求组合使用:
- 自定义测试用例显示名称(最直观)
在TestCaseSource返回TestCaseData时,调用SetName方法将你需要排查的关键字段拼接到用例名称中,测试报告中会直接显示每条用例对应的核心参数,无需额外查看日志:private static IEnumerable<TestCaseData> GetDataToSubmit() { var simpleAssignment = new DummyAssigmentGenerator() // 你的生成逻辑 .Generate(); // 把需要排查的关键字段(比如任务类型、金额、关联ID等)拼接到用例名 yield return new TestCaseData(simpleAssignment) .SetName($"Test_SubmitAssignment_类型:{simpleAssignment.Type}_金额:{simpleAssignment.Amount}_ID:{simpleAssignment.Id}"); } - 输出全量测试数据到测试报告
借助NUnit内置的TestContext将测试对象全量序列化输出,所有输出内容会自动附加到对应测试用例的报告详情中,你可以在测试方法开头添加这段逻辑,也可以封装到测试基类的SetUp方法中全局生效:[Test] [TestCaseSource("GetDataToSubmit")] public async Task Test_SubmitAssignmentDynamicFlow(Assignment assignment) { // 输出全量测试数据,缩进格式化方便阅读 TestContext.WriteLine($"测试用例完整数据:\n{JsonSerializer.Serialize(assignment, new JsonSerializerOptions { WriteIndented = true })}"); // 你原来的测试逻辑 using var playwright = await Playwright.CreateAsync(); // ... } - 失败时附加关联排查信息
可以配合Playwright的故障排查能力,在测试失败时同时输出测试数据、页面截图、当前页面源码,进一步降低定位成本:[Test] [TestCaseSource("GetDataToSubmit")] public async Task Test_SubmitAssignmentDynamicFlow(Assignment assignment) { using var playwright = await Playwright.CreateAsync(); await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = false }); var page = await browser.NewPageAsync(); try { // 你的测试逻辑 } catch (Exception) { // 失败时输出数据+截图 TestContext.WriteLine($"失败用例数据:\n{JsonSerializer.Serialize(assignment, new JsonSerializerOptions { WriteIndented = true })}"); var screenshotPath = Path.Combine(AppContext.BaseDirectory, $"{TestContext.CurrentContext.Test.Name}_失败截图.png"); await page.ScreenshotAsync(new PageScreenshotOptions { Path = screenshotPath, FullPage = true }); TestContext.AddTestAttachment(screenshotPath, "失败页面全量截图"); throw; } } - 结构化存储测试参数(适配自定义报告)
如果你使用自定义的测试报告模板,还可以将测试对象的字段存入TestCaseData的Properties集合,报告可以直接读取这些属性做结构化展示,比纯日志更易读:yield return new TestCaseData(simpleAssignment) .SetName($"Test_SubmitAssignment_{simpleAssignment.Id}") .SetProperty("TaskType", simpleAssignment.Type) .SetProperty("Amount", simpleAssignment.Amount) .SetProperty("Creator", simpleAssignment.Creator);
注意:如果你的
Assignment对象包含敏感字段(比如密码、密钥),序列化输出时请先做脱敏处理,避免敏感信息泄露到测试报告中。
内容的提问来源于stack exchange,提问作者Umair Tahir
相关产品推荐
相关产品推荐

