SuperAPI AI 工具集

playwright-test-results

测试与质量

查看项目

更新于 10-15 17:37

技能介绍

用途

Playwright Test Results (DuckDB) 将近期 Playwright CI 测试结果汇总到单个 DuckDB 文件中,让你能用普通 SQL 回答关于测试失败、不稳定性(flaky)和慢测试的问题,数据每几小时刷新一次。

主要能力

  • 单个 DuckDB 文件保存近期结果,无需自建数据管道。
  • 提供下载(download)与增量更新(update)命令,可补齐快照缺失的最新运行。
  • 通过随附的 @duckdb/node-api 绑定查询,无需单独安装 DuckDB。
  • 支持按运行、SHA、PR、工作流、CI bot、项目、标签、注解等维度分析失败率、跨运行 flaky、重试救援等情况。
  • 提供示例查询,包括跨运行 flaky 排行、按标签过滤,以及生成带链接的 emoji 运行历史 Markdown。
  • 对于需要完整步骤树/附件/stdio 的场景,可通过 run_id + bot_name 定位并下载该运行的 blob 报告产物。

使用方式

  1. 首次在仓库根目录执行 npm ci。
  2. 下载最新快照:GITHUB_TOKEN=$(gh auth token) node utils/test-results-db/cli.ts download。
  3. 如需补齐最新运行:GITHUB_TOKEN=$(gh auth token) node utils/test-results-db/cli.ts update --lookback-days 3。
  4. 使用随附绑定查询,例如:
node --input-type=module -e '
import { DuckDBInstance } from "@duckdb/node-api";
const conn = await (await DuckDBInstance.create("utils/test-results-db/test-results.duckdb")).connect();
console.table((await conn.runAndReadAll(process.argv[1])).getRowObjectsJson());
' "SELECT count(*) FROM test_results"

注意:整数列以字符串返回(JSON 安全),排序与过滤应在 SQL 中完成,而不是在 JS 中。

数据表结构

只有一张表 test_results,每行对应一条测试结果(每次重试一行)。列由 reporter 输出的 parquet 推断(tests/config/parquetReporter.ts),并附加两列由该 CLI 添加。

列 含义
run_id, run_attempt GitHub Actions 运行身份
run_started_at 运行开始时间
workflow_name 如 tests 1 / tests 2 / tests others / MCP
event push / pull_request
head_sha, head_branch, pr_number 被测试的内容
bot_name 如 chromium-ubuntu-22.04-node20、webkit-macos-15-large,即 CI bot;OS 与架构编码于此,没有单独的 os 列
project_name CI 项目 = 浏览器 + 套件,如 chromium-page、webkit-library、playwright-test
test_title 文件内的标题路径,用 › 连接(describe › test)
file, line, column_number 源码位置(file 相对仓库根目录)
expected_status passed / skipped / ...
status 实际结果:passed / failed / timedOut / skipped / interrupted
retry 0 = 首次尝试
result_started_at 本次尝试开始时间
duration_ms 结果耗时
error_message 拼接后的全部错误,已去除 ANSI(无错误时为 NULL)
tags 字符串列表,如 ['@slow', '@flaky'](使用列表函数 / list_contains)
annotations {type, description} 结构列表,如 [{'type': 'skip', 'description': 'flaky on CI'}](无则为空列表)
artifact_id 该行来源的 GitHub 产物(去重键)
ingested_at 仅调试用——该行被导入的时间

适用场景

  • 排查"红 CI 是否真的挂了":区分跨运行 flaky(终判在运行间翻转)与单次运行内被重试救援的 flake(failed→passed)。
  • 统计最常失败的测试、失败率与慢测试。
  • 按 run/SHA/PR 维度回溯某次运行的测试结果。
  • 在 GitHub 评论中生成紧凑的 emoji 运行历史(绿=通过,橙=重试救援,红=失败/超时,每格链接到对应运行尝试)。

限制与注意事项

  • 测试以 (project_name, file, test_title) 三元组标识,应按该元组分组(Playwright 的 test_id 哈希未存储,这三列是其原像)。
  • Flakiness 是派生而非存储的;最重要的信号是跨运行的终判翻转。
  • 区分真实失败与有意失败:过滤 expected_status = 'passed';标记 test.fail() 的测试记录为 status='failed' 且 expected_status='failed',否则会主导"最常失败"列表。
  • 数据库按运行数量限制大小:最旧的完整运行会随时间被淘汰,因此只保留近期窗口,而非完整历史。
  • blob 与 parquet 产物保留 7 天,因此完整步骤树/附件/stdio 的获取仅对近期运行有效;数据库本身保留摘要更久(直到被运行数淘汰)。
  • 快照可能缺少最新运行,需执行 update 补齐。