You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();
        }
    }
}

关键实现说明

  1. 手动控制步骤状态
    使用AllureApi.StartStep创建步骤上下文,替代原有的AllureApi.Step方法,这样可以灵活设置步骤的成功/失败状态,以及添加异常细节。

  2. 失败强制截图
    在catch块中捕获所有异常,通过Playwright的ScreenshotAsync获取截图字节流,直接添加为Allure报告的附件(避免依赖本地文件路径,适配CI环境),同时标记步骤为失败并补充异常信息,最后重新抛出异常保证测试用例的失败状态被NUnit正确识别。

  3. 可选步骤后截图
    通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:50:08