🚀 yuantest-playwright:让 Playwright 测试管理更优雅的利器

138 阅读14分钟

一款强大的 Playwright 测试编排器、执行器和报告器,提供 CLI 命令行工具和 Web Dashboard 可视化界面


image.png

📌 目录


前言

在 E2E 测试的道路上,你是否遇到过这些痛点?

  • 🔥 测试套件越来越大,执行时间越来越长,CI 等待时间令人抓狂
  • 😵 Flaky 测试像幽灵一样,时好时坏,难以捉摸,严重影响团队效率
  • 📊 测试报告分散,缺乏统一的历史趋势分析,无法量化测试质量
  • 🐛 测试失败后,定位问题耗时耗力,缺乏有效的失败分析工具
  • 🔄 CI/CD 流程中,测试编排效率低下,资源利用率不高

如果你有以上任何困扰,那么 yuantest-playwright 可能正是你需要的解决方案!


项目介绍

yuantest-playwright 是一个强大的 Playwright 测试编排器、执行器和报告器,提供 CLI 命令行工具和 Web Dashboard 可视化界面,帮助团队更高效地管理和分析 E2E 测试。

它的核心理念是 "零学习曲线、零迁移成本、纯 Playwright 生态"——所有 CLI 参数与 Playwright CLI 完全一致,不依赖任何 Playwright 内部 API,用户可随时无缝切换回原生 Playwright。

npm install -g yuantest-playwright

核心架构

在深入每个功能之前,先了解 yuantest-playwright 的整体架构设计:

flowchart TB
    subgraph 用户层
        CLI[CLI 命令行]
        DASH[Web Dashboard]
        API[REST API]
    end

    subgraph 核心引擎
        ORC[编排器<br/>智能分片 · 负载均衡]
        EXE[执行器<br/>Playwright CLI 集成]
        RPT[报告器<br/>HTML · JSON · 实时推送]
    end

    subgraph 智能分析
        FLAKY[Flaky 管理器<br/>分类 · 根因 · 隔离 · 预测]
        DIAG[AI 诊断引擎<br/>LLM 推理 · 知识库 · 聚类]
        VIS[视觉测试<br/>像素对比 · 基线管理]
    end

    subgraph 辅助系统
        ANN[注解系统<br/>@skip @slow @flaky]
        TAG[标签系统<br/>三重过滤]
        TRACE[Trace 管理<br/>截图 · 视频 · 产物]
    end

    subgraph 基础设施
        WS[WebSocket 实时推送]
        STORE[存储抽象层<br/>内存 · 文件系统]
        CACHE[LRU/TTL 缓存]
        I18N[国际化 中/英]
    end

    CLI --> ORC
    DASH --> API
    API --> EXE

    ORC --> EXE
    EXE --> RPT
    EXE --> FLAKY
    RPT --> WS
    WS --> DASH

    FLAKY --> DIAG
    EXE --> VIS
    EXE --> TRACE
    ORC --> ANN
    ORC --> TAG

    FLAKY --> STORE
    DIAG --> CACHE
    RPT --> STORE

    style ORC fill:#4ecdc4,color:#fff
    style EXE fill:#45b7d1,color:#fff
    style FLAKY fill:#e74c3c,color:#fff
    style DIAG fill:#9b59b6,color:#fff
    style WS fill:#f39c12,color:#fff

整个系统围绕 编排 → 执行 → 分析 → 反馈 的闭环设计,每个模块各司其职又紧密协作。


智能测试编排

当测试套件从几十个增长到数百甚至上千个时,如何高效地分配执行资源就成了关键问题。yuantest-playwright 的编排器提供了业界领先的 方差感知智能分片 算法。

传统分片 vs 智能分片

传统分片通常采用简单的轮询(Round-Robin)分配,看似每个分片分到相同数量的测试,但实际上:

传统轮询分片:
  分片1: [测试A(2s), 测试B(3s), 测试C(2s)] = 7s  ✅
  分片2: [测试D(30s), 测试E(25s), 测试F(20s)] = 75s  ❌ 等待时间爆炸!

智能分片:
  分片1: [测试D(30s), 测试A(2s), 测试B(3s)] = 35s
  分片2: [测试E(25s), 测试F(20s), 测试C(2s)] = 47s
  → 最大分片耗时从 75s 降到 47s,效率提升 37%

三阶段智能分片算法

flowchart TD
    A[测试文件列表] --> B[估算执行时间]
    B --> C{运行次数 ≥ 3?}

    C -- 是 --> D[EMA 指数移动平均<br/>α = 0.3<br/>置信度由 CV 决定]
    C -- 1~2次 --> E[简单平均 +<br/>同类推断加权]
    C -- 0次 --> F{同目录有历史?}
    F -- 是 --> G[同类测试中位数推断<br/>置信度 0.3]
    F -- 否 --> H[默认超时时间<br/>置信度 0.1]

    D --> I[第一阶段:<br/>高风险测试优先分散]
    E --> I
    G --> I
    H --> I

    I --> J[风险评分 = CV×0.6 + 1-置信度×0.4<br/>风险 > 0.4 → 高风险]
    J --> K[高风险测试分配到<br/>方差累计最小的分片<br/>多样性惩罚避免集中]

    K --> L[第二阶段:<br/>稳定测试 LPT 贪心分配]
    L --> M[按预估时间降序<br/>选择有效负载最小的分片<br/>effectiveLoad = load + 0.5×√variance]

    M --> N[第三阶段:<br/>两两交换重平衡]
    N --> O[最多 10 轮迭代<br/>最大/最小负载差 > 1% 时触发<br/>交换或移动测试减少最大负载]

    O --> P[输出分片方案]

    style D fill:#2ecc71,color:#fff
    style J fill:#e74c3c,color:#fff
    style L fill:#3498db,color:#fff
    style N fill:#f39c12,color:#fff

反馈闭环校准

分片不是一次性的——系统会持续学习和校准。每次分片执行完成后,对比预测耗时与实际耗时,自动调整校准因子:

校准因子 = 旧因子 × (1 - 0.2) + 实际/预测 × 0.2

校准因子被限制在 [0.5, 2.0] 范围内,所有估算值最终都会乘以该校准因子,确保预测越来越准。


Flaky 测试全链路治理

这是 yuantest-playwright 最具竞争力的杀手级功能。不同于其他工具仅提供简单的重试或跳过,yuantest-playwright 构建了一套从检测到修复验证的 全链路治理体系

治理全景图

flowchart LR
    A[测试执行] --> B[结果记录]
    B --> C[智能分类<br/>Wilson 置信区间]
    C --> D[根因分析<br/>7 种根因]
    D --> E[分级隔离<br/>根因感知重试]
    E --> F[执行器集成<br/>自动过滤]

    C --> G[关联分析<br/>Jaccard 共现聚类]
    C --> H[趋势追踪<br/>CUSUM 变点检测]
    C --> I[健康评分<br/>A-F 等级]
    H --> J[预测性检测<br/>多信号融合]

    D --> K[因果依赖图<br/>根因定位]

    F --> L[自动释放/降级]
    L --> A

    G --> M[Dashboard 可视化]
    I --> M
    J --> M
    K --> M

    style C fill:#4ecdc4,color:#fff
    style D fill:#e74c3c,color:#fff
    style E fill:#f39c12,color:#fff
    style J fill:#9b59b6,color:#fff

智能分类器:6 种精准分类

传统做法只看"是否有时通过有时失败",但实际情况远比这复杂。yuantest-playwright 基于 Wilson 置信区间时间衰减加权失败率,将测试细分为 6 种类型:

flowchart TD
    A[测试结果输入] --> B{运行次数 ≥ 5?}
    B -- 否 --> C[insufficient_data<br/>数据不足]
    B -- 是 --> D{连续失败 ≥ 5 次?}
    D -- 是 --> E[broken<br/>已损坏]
    D -- 否 --> F{近期失败率 ≥ 60%<br/>且历史失败率 ≤ 20%?}
    F -- 是 --> G[regression<br/>回归]
    F -- 否 --> H{加权失败率 ≥ 0.3?}
    H -- 是 --> I[flaky<br/>不稳定]
    H -- 否 --> J{加权失败率 ≥ 0.1?}
    J -- 是 --> K[monitor<br/>需关注]
    J -- 否 --> L[stable<br/>稳定]

    style C fill:#95a5a6,color:#fff
    style E fill:#e74c3c,color:#fff
    style G fill:#e67e22,color:#fff
    style I fill:#f39c12,color:#fff
    style K fill:#3498db,color:#fff
    style L fill:#2ecc71,color:#fff
分类含义判定条件
flaky不稳定测试加权失败率 ≥ 0.3,Wilson 下界超过阈值
broken已损坏测试连续失败 ≥ 5 次
regression回归测试前期稳定(历史失败率 ≤ 20%),近期持续失败(近期失败率 ≥ 60%)
monitor需关注测试加权失败率在 0.1 ~ 0.3 之间
stable稳定测试加权失败率 < 0.05
insufficient_data数据不足运行次数 < 5 次

为什么用 Wilson 置信区间? 小样本下简单失败率会产生误导——跑了 2 次失败 1 次,50% 失败率看似严重,但 Wilson 区间会告诉你:置信度不够,不要过早下结论。

为什么用时间衰减加权? 一个测试 3 个月前经常失败、最近一直通过,和最近才开始频繁失败,是完全不同的情况。时间衰减确保最近的测试结果权重最高:weight = exp(-decayRate × ageInDays)

根因分析器:7 种根因自动检测

识别出 Flaky Test 只是第一步,更重要的是回答"为什么 Flaky":

根因类型检测方法典型建议
timing超时关键词 + 持续时间变异系数(CV>0.5)增加等待时间,使用显式等待替代固定 sleep
data_race不同分片间通过率差异 ≥ 30%增加同步机制,避免共享可变状态
environment失败时间聚集 + 特定 CI 节点失败率 ≥ 50%改善环境隔离,使用容器化
external_service网络/5xx 错误关键词增加 Mock/Stub,实现服务降级策略
test_order前置测试在 ≥ 50% 失败中出现确保测试独立性,重置共享状态
resource_leak内存关键词 + 持续时间递增趋势添加资源清理逻辑,检查内存泄漏
assertion_flaky断言关键词(排除时序错误为主的情况)放宽断言精度,使用模糊匹配

分级隔离策略:不是一刀切的跳过

传统做法遇到 Flaky Test 要么跳过、要么重试,但不同根因需要截然不同的处理策略。yuantest-playwright 提供了 4 级隔离 + 根因感知重试

隔离级别

级别行为适用场景
none正常执行稳定测试
monitor继续执行,增加观察轻度不稳定
soft_quarantine允许重试,不计入主流程中度不稳定
hard_quarantine完全跳过不执行严重不稳定

根因感知重试(核心创新点)——不同根因需要不同的重试策略:

根因类型最大重试延迟倍数仅通过时重试
timing3×2
external_service3×3
data_race2×1
environment3×2
resource_leak1×5
test_order0--
assertion_flaky1×1

💡 "仅通过时重试" 是什么意思?当测试首次通过时,再重跑一次验证是否真的稳定。如果重跑也通过,才认为测试真正通过。这专门针对数据竞争等间歇性问题设计。

隔离预算管理:最大隔离比例 20%,最小可隔离数 3 个,预算不足时自动降级为 monitor 模式。

自动释放机制:软隔离连续通过 3 次释放,硬隔离连续通过 5 次释放,30 天后自动降级而非直接释放。

关联分析:发现系统性问题

多个 Flaky Test 同时出现,可能并非独立事件,而是同一根因的不同表现。yuantest-playwright 使用 Jaccard 共现系数 + 并查集(Union-Find)聚类 来发现这种关联:

flowchart LR
    A[多个 Flaky Test] --> B[计算两两<br/>Jaccard 共现系数]
    B --> C{共现系数 ≥ 0.6?}
    C -- 是 --> D[合并到同一关联组]
    C -- 否 --> E[独立处理]
    D --> F[并查集聚类]
    F --> G[输出关联组]

    G --> H[same_error_pattern<br/>相同错误模式]
    G --> I[same_file<br/>同一文件]
    G --> J[same_run<br/>同次运行]
    G --> K[same_time_window<br/>同一时间窗口]

    style G fill:#9b59b6,color:#fff

趋势分析与健康评分

能力方法价值
趋势方向检测线性回归 + R² 判断判断 Flaky 是在改善还是恶化
变点检测CUSUM 算法精确定位失败率突变的时间点
季节模式检测按小时/天/周分析发现周期性波动
代码变更关联变点与提交时间关联快速定位引入 Flaky 的代码变更
7 天预测线性回归 + 季节调整预判 Flaky 走势

四维健康评分体系

健康评分 = 稳定性(35%) + 趋势(25%) + 可恢复性(20%) + 可预测性(20%)
等级分数范围含义
A≥ 0.9优秀
B≥ 0.75良好
C≥ 0.6一般
D≥ 0.4较差
F< 0.4危险

预测性检测:在失败发生前预警

通过 多信号融合,在测试真正失败之前就能预警:

flowchart TD
    A[测试历史数据] --> B[持续时间异常<br/>Z-Score > 2.0]
    A --> C[失败模式信号<br/>近期 vs 历史差异 > 10%]
    A --> D[环境偏移信号<br/>持续时间分布偏移 > 30%]
    A --> E[资源压力信号<br/>持续时间递增趋势]

    B --> F[信号加权融合]
    C --> F
    D --> F
    E --> F

    F --> G[输出预测结果]
    G --> H[是否将失败]
    G --> I[失败概率]
    G --> J[置信度]
    G --> K[建议操作]

    style F fill:#e74c3c,color:#fff
    style G fill:#9b59b6,color:#fff

因果依赖图:找到"幕后黑手"

当多个测试同时 Flaky 时,谁是因、谁是果?因果依赖图通过 入度分析 识别根因节点——入度低、出度高的节点更可能是根因:

flowchart LR
    subgraph 因果依赖图示例
        A[共享数据库] -->|same_environment| B[测试 A]
        A -->|same_environment| C[测试 B]
        A -->|same_environment| D[测试 C]
        E[外部支付 API] -->|same_environment| C
        E -->|same_environment| F[测试 D]
    end

    style A fill:#e74c3c,color:#fff
    style E fill:#e74c3c,color:#fff

上图中"共享数据库"和"外部支付 API"就是根因节点,通过 BFS 遍历计算影响范围,输出风险等级(critical / high / medium / low)。

# 查看 Flaky 统计
yuantest flaky

# 隔离所有 Flaky 测试
yuantest flaky --quarantine-all

AI 智能失败诊断

测试失败了,但错误信息晦涩难懂?yuantest-playwright 内置了 AI 智能诊断引擎,让 LLM 帮你分析失败原因、给出修复建议。

诊断流程全景

flowchart TD
    A[测试失败] --> B[上下文富集<br/>6 维信息收集]
    B --> C[知识库模式匹配<br/>18 种 Playwright 错误模式]
    C --> D[构建增强 Prompt<br/>注入 Few-Shot 示例]
    D --> E[Agent 多轮推理<br/>最多 5 轮工具调用]
    E --> F[置信度校准<br/>多维度加分]
    F --> G[输出诊断结果]

    B --> B1[源代码上下文<br/>失败行 ±20 行]
    B --> B2[截图分析<br/>base64 编码]
    B --> B3[控制台日志]
    B --> B4[堆栈跟踪]
    B --> B5[环境信息<br/>浏览器/OS/Node]
    B --> B6[历史数据<br/>最近 5 次运行]

    E --> E1[read_source_file<br/>读取源码]
    E --> E2[search_codebase<br/>搜索代码模式]
    E --> E3[query_test_history<br/>查询测试历史]
    E --> E4[read_screenshot<br/>读取失败截图]

    style B fill:#4ecdc4,color:#fff
    style E fill:#9b59b6,color:#fff
    style F fill:#f39c12,color:#fff

18 种 Playwright 错误模式知识库

系统内置了 6 大类 18 种 Playwright 常见错误模式,每种都配有中英文根因模板、修复建议和官方文档链接:

类别错误模式示例
TimeoutError (6种)元素等待超时、导航超时、API 响应超时、并发竞争超时、内存溢出、并发冲突Timeout.*waiting for.*selector
SelectorError (4种)元素不存在、选择器歧义、iframe 内选择器、Headless 环境差异strict mode violation
AssertionError (5种)文本不匹配、可见性断言、属性断言、数据验证、状态不一致Expected.*text.*received
NetworkError (5种)请求失败、CORS 跨域、DNS 解析失败、环境配置错误、依赖缺失net::ERR_
FrameError (2种)Frame 已分离、跨 Frame 安全限制frame.*detached
AuthError (2种)Token 过期、未登录重定向401.*Unauthorized

💡 知识库支持运行时注册自定义错误模式,你可以针对自己项目的特定错误类型扩展知识库。

Agent 多轮推理

不同于简单的"把错误信息丢给 LLM",yuantest-playwright 实现了 Agent 循环——LLM 可以主动调用工具来获取更多信息:

flowchart TD
    A[构建初始消息<br/>system + user + 截图] --> B[调用 LLM]
    B --> C{返回 tool_calls?}

    C -- 否, 有内容 --> D[直接返回<br/>mode=single]
    C -- 否, 无内容 --> E[降级单次调用<br/>mode=single]
    C -- 是 --> F[执行工具调用]

    F --> F1[read_source_file<br/>读取源码文件]
    F --> F2[search_codebase<br/>搜索代码模式]
    F --> F3[query_test_history<br/>查询历史记录]
    F --> F4[read_screenshot<br/>读取失败截图]

    F1 --> G[记录 ReasoningStep]
    F2 --> G
    F3 --> G
    F4 --> G

    G --> H[追加工具结果到消息]
    H --> I{达到 5 轮?}
    I -- 否 --> B
    I -- 是 --> J[不带 tools 最终调用<br/>mode=agent]

    style B fill:#9b59b6,color:#fff
    style F fill:#e74c3c,color:#fff
    style G fill:#f39c12,color:#fff

安全机制:工具调用有严格的路径限制(只允许 process.cwd() 下)、敏感文件过滤(.env.key 等)、目录过滤(node_modules.git 等),确保不会泄露敏感信息。

SSE 流式诊断

不想等待完整诊断结果?系统支持 SSE 流式输出,诊断过程实时可见:

event: start
data: {"testTitle": "登录流程测试"}

event: chunk
data: {"content": "分析错误信息..."}

event: chunk
data: {"content": "根因:页面加载超时..."}

event: complete
data: {"diagnosis": {...完整诊断结果}}

批量聚类诊断

当一次运行中多个测试同时失败时,系统会先通过 Jaccard 相似度 聚类相似失败,然后对每个聚类的代表测试执行 AI 诊断,避免重复分析,大幅节省 LLM 调用成本。

置信度校准

LLM 给出的置信度不一定可靠,系统通过多维度加分进行校准:

校准置信度 = LLM置信度 × 0.6 + 模式匹配加分(0.2) + 截图加分(0.1) + 源码加分(0.1) + 日志加分(0.05) + 历史加分(0.1)

当校准置信度 < 0.5 时,自动追加低置信度警告,提醒开发者谨慎参考。


实时报告与可视化

WebSocket 实时推送

测试执行过程中,进度和结果通过 WebSocket 实时推送到 Dashboard,无需等待测试完成:

flowchart LR
    A[Executor<br/>执行测试] --> B[ProgressReporter<br/>自定义 Reporter]
    B -->|stderr<br/>__PW_PROGRESS__| C[handleProgressData<br/>解析 JSON]
    C --> D[EventEmitter<br/>事件分发]
    D --> E[RealtimeReporter<br/>WebSocket 服务端]
    E -->|批量推送<br/>10条/批 或 100ms| F[Dashboard UI<br/>实时更新]

    style A fill:#4ecdc4,color:#fff
    style E fill:#f39c12,color:#fff
    style F fill:#3498db,color:#fff

批量推送优化:测试结果先放入缓冲区,满 10 条或 100ms 后批量推送,减少 WebSocket 消息频率,提高性能。

自动重连:客户端使用指数退避策略(1s ~ 30s,最多 10 次),确保网络波动时自动恢复连接。

多维度报告

  • HTML 报告 - 自动生成详细的测试报告,方便分享和存档
  • JSON 报告 - 结构化数据,便于程序化处理
  • Blob 报告 - 支持重跑场景下的报告合并
  • 历史趋势分析 - 追踪测试通过率和执行时间趋势,量化测试质量

视觉回归测试

yuantest-playwright 集成了基于 像素级对比 的视觉回归测试,使用 pixelmatch + pngjs 实现:

flowchart TD
    A[捕获当前截图] --> B{基线截图存在?}
    B -- 否 --> C[状态: new<br/>保存为基线]
    B -- 是 --> D[像素级对比<br/>pixelmatch]

    D --> E[计算差异比率<br/>diffRatio = diffPixels / totalPixels]
    E --> F{diffRatio ≤ threshold?}
    F -- 是 --> G[状态: identical<br/>匹配成功]
    F -- 否 --> H{diffPixels ≤ maxDiffPixels?}
    H -- 是 --> G
    H -- 否 --> I{diffRatio > maxDiffPixelRatio?}
    I -- 是 --> J[状态: regression<br/>严重回归]
    I -- 否 --> K[状态: different<br/>有差异]

    D --> L[生成差异图<br/>diff/browser/testId.png]

    style G fill:#2ecc71,color:#fff
    style J fill:#e74c3c,color:#fff
    style K fill:#f39c12,color:#fff

双层阈值机制

  • 比率阈值 threshold:差异比率低于此值判定为匹配(默认 0.1)
  • 绝对像素阈值 maxDiffPixels:差异像素绝对数量在允许范围内仍判定为匹配(默认 100)

基线管理:支持一键更新基线、批量更新基线,以及 updateSnapshots 模式自动接受新快照。


注解与标签系统

注解系统

支持 8 种 Playwright 原生注解,两种检测方式:

注解类型代码模式注释模式
skiptest.skip()@skip reason
onlytest.only()-
failtest.fail()-
slowtest.slow()@slow
fixmetest.fixme()@fixme TODO: ...
todotest.todo()-
serialdescribe.serial()-
paralleldescribe.parallel()-

支持自定义注解,可配置 action: 'skip' | 'fail' | 'slow' | 'mark'

标签系统

双语法标签

// 显式标签语法
@tag('login')
@tag('critical')

// 快捷标签语法(13 种预定义)
@smoke @regression @critical @p0 @p1 @p2
@sanity @e2e @unit @integration @slow @fast @flaky

三重过滤机制

过滤方式逻辑示例
include并集——包含任意标签即保留--include smoke,critical
exclude排除——包含任意标签即排除--exclude flaky,slow
require交集——必须同时包含所有标签--require e2e,critical

Web UI

  • 执行器 image.png

  • 报告器

image.png

  • 详细错误展示

image.png

  • 分析器 image.png

快速上手

安装

# 全局安装(推荐)
npm install -g yuantest-playwright

# 或作为项目依赖
npm install --save-dev yuantest-playwright

运行测试

# 基本用法——与 Playwright CLI 完全一致的参数
yuantest run --test-dir ./tests

# 使用 4 个分片并行执行
yuantest run --test-dir ./tests --shards 4

# 指定多个浏览器
yuantest run --test-dir ./tests --browsers chromium,firefox

# 设置超时和重试
yuantest run --test-dir ./tests --timeout 60000 --retries 2

启动 Web Dashboard

# 默认端口 5274
yuantest ui

# 自定义端口
yuantest ui --port 8080

然后在浏览器打开 http://localhost:5274 查看可视化界面。


实战演示

场景一:大型测试套件优化

当你的测试套件越来越大时,执行时间会成为瓶颈:

# 使用智能分片加速大型测试套件
yuantest run --test-dir ./e2e --shards 8 --workers 4

# 隔离 Flaky 测试避免阻塞 CI
yuantest flaky --quarantine-all
yuantest run --test-dir ./e2e

场景二:CI/CD 集成

轻松集成到你的 CI/CD 流程中:

# GitHub Actions 示例
name: E2E Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run E2E tests
        run: |
          npm install -g yuantest-playwright
          yuantest run --test-dir ./e2e --shards 4 --output ./reports

      - name: Upload reports
        uses: actions/upload-artifact@v3
        with:
          name: test-reports
          path: reports/

场景三:AI 诊断失败测试

测试失败后,一键获取 AI 诊断:

# 通过 Dashboard 可视化界面点击"AI 诊断"按钮
# 或通过 REST API 调用
curl -X POST http://localhost:5274/api/v1/diagnosis \
  -H "Content-Type: application/json" \
  -d '{
    "title": "登录流程测试",
    "error": "Timeout waiting for selector .login-btn",
    "filePath": "e2e/login.spec.ts",
    "lineNumber": 42
  }'

# 流式诊断(SSE)
curl -X POST http://localhost:5274/api/v1/diagnosis/stream \
  -H "Content-Type: application/json" \
  -d '{...}'

场景四:多浏览器测试

一键在多个浏览器上运行测试:

# 在所有浏览器上运行测试
yuantest run --test-dir ./e2e --browsers chromium,firefox,webkit

# 仅在特定浏览器上运行
yuantest run --test-dir ./e2e --browsers chromium

编程 API

如果你需要在代码中集成,yuantest-playwright 提供了完整的编程 API:

import {
  Orchestrator,
  Executor,
  Reporter,
  FlakyTestManager,
  DiagnosisService,
  DashboardServer,
} from 'yuantest-playwright';

async function main() {
  // 1. 编排测试
  const orchestrator = new Orchestrator({
    projectName: 'my-app',
    testDir: './e2e',
    outputDir: './reports',
    shards: 4,
    browsers: ['chromium', 'firefox'],
  });
  await orchestrator.initialize();
  const plan = await orchestrator.orchestrate();

  // 2. 执行测试
  const executor = new Executor(orchestrator.getConfig());

  executor.on('test_result', (result) => {
    console.log(`[${result.status}] ${result.title} (${result.duration}ms)`);
  });

  executor.on('run_progress', (progress) => {
    console.log(`Progress: ${progress.passed}/${progress.totalTests} passed`);
  });

  executor.on('run_completed', async (result) => {
    // 3. 生成报告
    const reporter = new Reporter('./reports');
    const reportPath = await reporter.generateReport(result);
    console.log(`Report: ${reportPath}`);

    // 4. 分析失败
    const analysis = await reporter.analyzeFailures(result);
    console.log(`Failures: ${analysis.length}`);
  });

  const result = await executor.execute();
  console.log(`Final: ${result.passed}/${result.totalTests} passed`);

  // 5. 启动 Dashboard
  const server = new DashboardServer(5274, './reports', './test-data');
  await server.start();
}

main();

对比优势

特性yuantest-playwright原生 Playwright
智能分片✅ 方差感知 + 反馈校准❌ 手动配置
Flaky 检测✅ Wilson 区间 + 6 种分类❌ 无
Flaky 隔离✅ 4 级隔离 + 根因感知重试❌ 无
根因分析✅ 7 种根因自动检测❌ 无
关联分析✅ Jaccard 共现聚类❌ 无
趋势追踪✅ CUSUM 变点 + 季节模式❌ 无
健康评分✅ 四维 A-F 评分❌ 无
失败预测✅ 多信号融合❌ 无
因果图✅ 依赖图 + 影响分析❌ 无
AI 诊断✅ Agent 多轮推理 + 18 种知识库❌ 无
可视化 Dashboard✅ 现代化 Web UI❌ 仅 HTML 报告
实时进度✅ WebSocket 推送❌ 仅命令行输出
视觉测试✅ 像素级对比 + 差异图❌ 仅截图
注解系统✅ 8 种注解 + 自定义❌ 无
标签系统✅ 三重过滤❌ 仅 --grep
REST API✅ 20+ 端点❌ 无
国际化✅ 中/英双语❌ 无

环境要求

  • Node.js >= 16.0.0
  • npm >= 7.0.0
  • Playwright >= 1.40.0

相关链接

类型链接
📖 文档yuantest-playwright.readthedocs.io
📦 npm 包npmjs.com/package/yua…
🐙 GitHubgithub.com/yuandiv/yua…
📖 API 文档yuandiv.github.io/yuantest-pl…
🐛 问题反馈GitHub Issues

总结

如果你正在寻找一个能够:

  • 智能编排 —— 方差感知分片 + 反馈校准,提升 30-50% 执行效率
  • 根治 Flaky —— 从检测、分类、根因、隔离到预测的全链路治理
  • AI 诊断 —— Agent 多轮推理 + 18 种知识库,秒级定位失败原因
  • 实时可视化 —— WebSocket 推送 + 现代化 Dashboard
  • 深度集成 CI/CD —— 零侵入设计,随时可切换回原生 Playwright

的工具,不妨试试 yuantest-playwright

如果这个项目对你有帮助,欢迎给个 ⭐️ Star 支持一下!