如何在Allure.NUnit中设置AllureApi.Step结果并实现步骤截图
Allure.NUnit 步骤抽象实现方案
针对你提出的需求,我们可以通过手动控制Allure步骤上下文、结合Playwright截图API,实现失败强制截图、可选步骤后截图以及步骤结果自定义标记的功能,完整实现代码如下:
[AllureNUnit] internal abstract class PageTestBase : Microsoft.Playwright.NUnit.PageTest { // 可配置:子类重写此属性决定是否开启步骤后自动截图 protected virtual bool TakeScreenshotAfterEachStep => false; protected async Task Step(string name, Func<Task> action) { // 创建Allure步骤上下文,用于手动控制步骤状态 using var step = AllureApi.StartStep(name); try { await action(); // 显式标记步骤为成功(无异常时Allure会自动处理,此句可省略) step.Status = Status.Passed; } catch (Exception ex) { // 失败时强制截图,并将截图作为附件添加到Allure报告 var screenshotBytes = await Page.ScreenshotAsync(new() { FullPage = true }); AllureApi.AddAttachment( name: $"失败截图:{name}", contentType: "image/png", content: screenshotBytes ); // 标记步骤为失败,并补充异常详情 step.Status = Status.Failed; step.StatusDetails = new StatusDetails { Message = ex.Message, Trace = ex.ToString() }; // 重新抛出异常,确保NUnit标记测试用例为失败 throw; } finally { // 根据配置执行步骤后截图 if (TakeScreenshotAfterEachStep) { var postStepScreenshot = await Page.ScreenshotAsync(new() { FullPage = true }); AllureApi.AddAttachment( name: $"步骤后截图:{name}", contentType: "image/png", content: postStepScreenshot ); } // 确保步骤上下文被正确释放,完成步骤记录 step.Dispose(); } } }
关键实现说明
手动控制步骤状态
使用AllureApi.StartStep创建步骤上下文,替代原有的AllureApi.Step方法,这样可以灵活设置步骤的成功/失败状态,以及添加异常细节。失败强制截图
在catch块中捕获所有异常,通过Playwright的ScreenshotAsync获取截图字节流,直接添加为Allure报告的附件(避免依赖本地文件路径,适配CI环境),同时标记步骤为失败并补充异常信息,最后重新抛出异常保证测试用例的失败状态被NUnit正确识别。可选步骤后截图
通过TakeScreenshotAfterEachStep虚属性提供配置开关,子类可重写该属性开启/关闭功能。在finally块中执行截图逻辑,确保无论步骤成功或失败,只要配置开启就会执行截图。
子类使用示例
如果某个测试类需要开启步骤后截图,只需重写基类的配置属性即可:
internal class LoginTests : PageTestBase { // 开启当前测试类的步骤后自动截图 protected override bool TakeScreenshotAfterEachStep => true; [Test] public async Task 登录成功测试() { await Step("导航到登录页面", async () => { await Page.GotoAsync("/login"); }); await Step("输入账号密码", async () => { await Page.FillAsync("#username", "test_user"); await Page.FillAsync("#password", "test_pass"); }); await Step("点击登录按钮", async () => { await Page.ClickAsync("#login-btn"); }); } }
内容的提问来源于stack exchange,提问作者Michał Bryłka
相关产品推荐
相关产品推荐

