OpenObserve 前端 UI 自动化测试实战:Playwright 端到端测试框架完全指南
2026/9/13 10:35:11 网站建设 项目流程

OpenObserve 前端 UI 自动化测试实战:Playwright 端到端测试框架完全指南

【免费下载链接】openobserveOpen source observability platform for logs, metrics, traces, RUM, Session replay, pipelines, SLO and LLM observability. A sophisticated, simple and highly performant alternative to Datadog, Splunk, and Elasticsearch with 140x lower storage costs and single binary deployment.项目地址: https://gitcode.com/GitHub_Trending/op/openobserve

导读

OpenObserve 作为一款覆盖日志、指标、追踪、RUM、管道、SLO 与 LLM 可观测性的开源平台,其 Web 控制台功能庞杂、页面众多,如何保证每一次代码改动都不破坏既有功能?本指南围绕仓库 tests/ui-testing/README.md 中定义的 Playwright UI 测试方案,完整讲解从安装、运行到环境配置的完整流程,并结合仓库内真实的 Playwright 配置、全局登录/数据注入脚本与 CI 分片矩阵源码,带你掌握这套端到端测试框架的安装方式、执行命令、环境变量体系、核心配置项与 CI 集成原理。读完本文,你可以直接在本地或 CI 中搭建并运行 OpenObserve 的 UI 自动化测试套件,并理解其"单文件配置驱动、全局一次登录、并行分片执行"的工程化设计。


一、框架定位:这是一套怎样的 UI 测试体系

OpenObserve 的 UI 自动化测试位于 tests/ui-testing 目录,是一套完整的Playwright 端到端(E2E)测试套件,项目内部代号为 zinc-observe-ui-automation(源自早期 zincsearch 时代的命名,见 package.json 中的"name": "zincsearch")。

从目录结构看,这套体系包含五个核心组成部分:

组成部分路径职责
测试配置playwright.config.js、playwright-alpha1.config.js浏览器、超时、重试、报告器、CI 行为
测试用例playwright-tests/按功能域组织的 spec 文件(Alerts、Dashboards、Logs、Metrics、Traces、Pipelines、SLO 等)
页面对象pages/Page Object 模式封装,每个功能域对应一个页面对象目录
工具函数playwright-tests/utils/登录、数据注入、指标/追踪/RUM 数据生成、等待与断言助手
CI 矩阵ci-matrix/驱动 GitHub Actions 的测试分片清单

Playwright 测试用到的真实日志样例数据位于 tests/test-data/logs_data.json,全局 Setup 会将其注入到名为e2e_automate的测试流中,供各测试用例查询与断言(见 global-setup.js)。


二、环境准备与安装

2.1 依赖安装

进入测试目录并安装依赖:

cd tests/ui-testing npm install

依赖清单见 package.json,核心 devDependencies 包括:

  • @playwright/test(版本 1.55.1):测试框架本体;
  • dotenv(^17.2.1):从.env文件加载环境变量;
  • @types/node:TypeScript 类型支持。

此外,测试还依赖winston(日志)、pixelmatch+pngjs(像素级图片对比,用于截图类断言)、googleapis(邮件/云服务集成)、uuiddate-fns等运行时依赖。

2.2 对目标实例的要求

这套 UI 测试面向已部署运行中的 OpenObserve 实例(本地或远端均可),通过ZO_BASE_URL指定目标地址,并非内置 mock 服务。测试运行前请确保实例已启动且可访问,并有可用的根用户账号。


三、运行测试:三种方式

3.1 方式一:Playwright Runner UI(推荐)

原文档推荐使用专用的 Runner 界面进行可视化操作与调试:

cd playwright-runner npm start

启动后打开 http://localhost:3000 即可访问测试运行器界面,在 Web 界面中查看用例列表、选择要运行的测试,并通过界面设置环境变量(详见下文"环境配置")。

3.2 方式二:命令行

# 运行全部测试 npx playwright test # 按标签运行指定测试(-g 后跟 grep 表达式,可匹配标题/标签) npx playwright test -g @alertsImportExport # 有头模式运行(可观察浏览器操作过程,便于调试) npx playwright test --headed # 运行单个测试文件 npx playwright test Alerts/alerts-import.spec.js

各参数说明:

参数作用
-g <grep>按测试标题或标签(如@alertsImportExport)过滤用例
--headed有头模式,打开真实浏览器窗口
--config=<file>指定配置文件(如--config=playwright-alpha1.config.js
--workers=N指定并行 worker 数

仓库还内置了若干 npm scripts(见 package.json):

npm test # 等价于 npx playwright test npm run test:poc # 使用 POC 独立配置运行 npm run test:poc:headed # POC 配置 + 有头模式 npm run test:poc:debug # 输出 Playwright 协议调试日志 npm run report # 打开 POC 的 HTML 报告

3.3 测试目录与归档排除

所有 spec 文件位于 playwright-tests/ 下,按功能域分子目录组织:Alerts/Cloud/Dashboards/Logs/Metrics/Traces/Pipelines/SLO/RUM/Workflows/Reports/Functions/Streams/Infra/等。归档或废弃的用例(test-archives/***_old.js)会被配置自动排除,不参与运行(见 playwright.config.js)。


四、环境变量与配置体系

原文档明确指出测试可通过Playwright Runner UI(Web 界面设置)或环境变量(终端或.env文件)两种方式配置。以下是仓库源码中实际使用到的完整环境变量体系:

4.1 必备环境变量

playwright.config.js 在加载配置时会主动校验以下三个变量,缺失时打印告警:

变量含义
ZO_BASE_URLOpenObserve 实例地址(同时作为baseURL,供page.goto('/')使用)
ZO_ROOT_USER_EMAIL根用户邮箱,用于登录
ZO_ROOT_USER_PASSWORD根用户密码

4.2 常用可选环境变量

变量含义依据
ORGNAME组织标识,登录时通过?org_identifier=参数建立组织上下文global-setup.js
INGESTION_URL数据注入使用的 API 地址,默认回退到ZO_BASE_URLglobal-setup.js
CI置为 true 时启用 CI 专属行为(重试 3 次、blob 报告、截图/视频留存等)playwright.config.js
SLOW_MO_TESTS+TEST_SHARD为 Pipelines 分片启用slowMo: 1000,缓解部署环境同步问题playwright.config.js
SKIP_INGESTION置为true时跳过全局数据注入(仅登录)global-setup.js
ZO_RUM_PURGE_STREAM_DATA置为true时在 teardown 阶段清理 RUM 流中 24 小时前的数据global-teardown.js

4.3 .env 文件加载机制

配置加载流程(见 playwright.config.js):

  1. 引入dotenv并执行dotenv.config(),自动读取测试目录下的.env文件;
  2. 若 dotenv 不可用,回退到系统环境变量;
  3. 加载完成后校验必备变量,缺失时在控制台输出告警信息。

4.4 从 CI 工作流一键提取环境变量

仓库提供了 env.sh 脚本,可从.github/workflows/playwright.yml中提取env:段并导出为本地环境变量,避免手工维护两份配置:

source env.sh # 导出到当前 shell ./env.sh # 仅预览将要导出的变量

脚本逻辑:优先使用yq解析 YAML 的env段并生成export语句;若yq不可用,则用正则手工解析env:段(支持去除引号),两种方式都不依赖额外配置维护。


五、playwright.config.js 核心配置深度解析

playwright.config.js 是整个测试套件的"单一事实来源",以下逐项拆解其关键决策:

5.1 超时体系(多层超时)

配置项本地CI说明
timeout3 分钟5 分钟单个测试用例超时
expect.timeout10 秒30 秒断言(expect)超时
navigationTimeout30 秒90 秒页面导航超时
actionTimeout15 秒45 秒动作(点击、输入等)超时
globalTimeout40 分钟整个测试运行的总时间上限

CI 环境下所有超时均显著放宽,这是对部署实例网络延迟与页面渲染波动的工程化妥协。

5.2 重试与并行

  • retries:CI 下失败用例自动重试3 次,本地0 次
  • workers:固定5(本地与 CI 一致);
  • fullyParallel: true:不同测试文件之间完全并行;
  • forbidOnly: !!process.env.CI:CI 下若代码中残留test.only会直接构建失败,防止误提交调试代码。

5.3 报告器(Reporter)

CI 与本地采用完全不同的报告策略:

  • CI:使用blob报告器(输出到blob-report/,便于多分片结果合并),并挂载自定义的retry-banner-reporter.js——它在用例重试时向 stdout 打印醒目标志,弥补 blob 报告不输出日志导致的重试"不可见"问题;
  • 本地:输出html报告(playwright-results/html-report,默认不自动打开)与json报告(playwright-results/report.json,供下游报告消费方使用)。

5.4 浏览器项目与产物留存

  • 默认仅启用chromium项目(Desktop Chrome 设备配置),视口固定1500x1024,并授予剪贴板读写权限;
  • CI 下 Chromium 以--no-sandbox --disable-setuid-sandbox启动(容器环境无用户命名空间);
  • 失败诊断产物:CI 下开启screenshot: 'only-on-failure'video: 'retain-on-failure'trace: 'on-first-retry'会在首次重试时收集 Playwright Trace;
  • webkit、移动端、Edge 等项目已注释保留,可按需启用。

六、全局 Setup / Teardown:一次登录、全局注入数据

测试套件通过globalSetupglobalTeardown钩子实现"运行前统一准备、运行后统一清理"。

6.1 全局 Setup 流程(global-setup.js)

整个套件只执行一次的初始化,包含四大步骤:

  1. 建立组织上下文登录:跳转${ZO_BASE_URL}?org_identifier=${ORGNAME},优先点击[data-test="login-as-internal-user"](内部用户登录),再填写[data-test="login-user-id-field"][data-test="login-password-field"]并点击[data-test="login-sign-in"]。值得注意的是,代码注释明确指出:OInput 组件的外层包装携带data-test="<name>",而真正的输入元素携带data-test="<name>-field",Playwright 的fill()只能作用于可填充元素,因此必须选择带-field后缀的选择器——这是与 OpenObserve 前端组件约定深度绑定的关键细节。
  2. 登录成功校验:等待[data-test="navbar-main-nav"]主导航栏出现即视为登录成功,并保存认证状态到playwright-tests/utils/auth/user.json,后续所有测试上下文复用该 storageState,避免每个用例重复登录。
  3. 全局日志数据注入:通过POST ${INGESTION_URL}/api/${ORGNAME}/e2e_automate/_json接口(Basic Auth)将 tests/test-data/logs_data.json 中的日志批量注入到e2e_automate流,返回非 200 即判定失败。
  4. 追踪与 RUM 数据注入:注入 20 条测试追踪数据(ingestTraces)与 3 类 RUM 错误数据(ingestRumErrors)。指标数据已从全局 Setup 移除,改为在各用例的beforeAll中注入,以避免实例指标端点未就绪时产生 404。

此外,脚本支持两种跳过场景:仅运行cleanup.spec.js(正则精确匹配文件名)或设置SKIP_INGESTION=true时跳过全部数据注入。

6.2 全局 Teardown 流程(global-teardown.js)

Teardown 相对轻量,核心是可选的 RUM 数据清理:OpenObserve 没有按谓词删除的能力,RUM 数据流测试会持续向共享的_rumdata/_rumlog/_sessionreplay流写入真实行,长期运行会导致数据膨胀。因此当ZO_RUM_PURGE_STREAM_DATA=true时,Teardown 会在所有用例结束后一次性清理 24 小时前的数据(ZO_RUM_PURGE_OLDER_THAN_HOURS可调)。清理为"尽力而为",失败不会导致整个运行报错。

注意:Teardown 刻意不删除user.json,因为并行测试文件运行期间删除认证文件会引发竞态条件——这正是"全局状态生命周期"设计的细节体现。


七、云端 / Alpha 环境专项配置

playwright-alpha1.config.js 是面向 OpenObserve 云端(Alpha 环境)的独立配置,与本地配置形成互补:

  • 登录方式不同:使用 Dex "Continue with Email" 登录流,环境变量改用ALPHA1_USER_EMAIL/ALPHA1_USER_PASSWORD,并自动回填为ZO_ROOT_USER_*供既有 spec 与工具模块复用;
  • 全局 Setup 不同:使用global-setup-alpha1.js,登录后执行 UI 组织切换,使 Pinia store 绑定目标组织,并写出包含 ingest passcode 的cloud-config.json
  • 容器化 Chromium 优化:启动参数加入--disable-dev-shm-usage(容器默认仅 64MB/dev/shm,5 个 worker 并行时 Chromium 会耗尽共享内存导致渲染进程崩溃、表现为 "runner lost communication"),以及--no-sandbox --disable-setuid-sandbox --disable-gpu
  • 资源竞争策略:Alerts 类重型 spec 在共享云组织下并发争抢慢速列表接口,通过页面对象层的有界重试 + 套件级retries: 2吸收抖动,且仅失败用例重试,不影响通过用例;
  • 固定超时:统一timeout: 5 * 60 * 1000,因为 multi-panel 类 spec 在登录与数据注入后本身就需要 2.4~3.0 分钟。

若需要运行云端测试:

ZO_BASE_URL=https://<your-alpha-instance> \ ALPHA1_USER_EMAIL=<email> \ ALPHA1_USER_PASSWORD=<password> \ ORGNAME=<org> \ npx playwright test --config=playwright-alpha1.config.js

八、测试组织、Page Object 与常量体系

8.1 Page Object 模式

pages/ 目录按功能域封装页面对象:alertsPages/dashboardPages/logsPages/metricsPages/tracesPages/pipelinesPages/sloPages/rumPages/等,通过 page-manager.js 统一管理,配合 commonActions.js 沉淀跨页面公共操作。测试用例只与页面对象交互,不直接操作 DOM 细节,降低前端结构变更对用例的冲击。

8.2 测试常量与最佳实践

test-constants.js 集中管理测试数据、字段名与等待时间。特别值得注意其代码注释中的工程主张

固定waitForTimeout是 Playwright 中的反模式(anti-pattern),仅在动画过渡、无法修复的竞态、无加载状态的第三方组件场景下使用。

优先的等待方式依次为:

await page.waitForLoadState('networkidle'); // 网络空闲 await element.waitFor({ state: 'visible' }); // 元素可见 await expect(element).toBeVisible(); // 断言式等待 await page.waitForSelector('[data-test="element"]'); // 选择器等待

该文件还沉淀了流名常量(e2e_automatee2e_matchall)、Kubernetes 语义字段名(kubernetes_pod_namekubernetes_namespace等)、SQL 查询模板(SUBQUERY / CTE / GROUP_BY)与测试优先级 P0/P1/P2。

8.3 可视化辅助工具

utils/ 中还有一批值得复用的工程化助手:MonacoEditorHelper.js(操作查询编辑器)、webhook-capture.js(捕获 Webhook 请求用于告警链路断言)、slack-reporter.js(Slack 通知)、zip-builder.jsmail-sink.js等,支撑了告警、管道、报告等复杂链路的端到端验证。


九、CI 分片矩阵:测试规模的工程化管控

当测试用例达到数百个(playwright-tests/ 下共有 330 余个 spec 文件),单 job 串行执行已不可行。ci-matrix/README.md 说明了分片方案:ci_matrix.json 是 OSS 与 Enterprise 双仓库 Playwright 工作流共享的唯一分片清单,CI 通过build-ci-matrix.js在运行时生成矩阵。

分片(shard)字段说明:

字段含义
testfolder分片标签,成为 job 名e2e / <testfolder>(须唯一)
actual_folderplaywright-tests/下的真实目录
browser浏览器(chrome
run_files该分片运行的 spec 文件名列表
disabled有意关闭的用例(保留记录,可 git 追溯)
quick_mode_enabledZO_QUICK_MODE_ENABLED启动该分片服务
ingest_allowed_upto允许回溯注入的小时数(默认 5 小时;SLO-Measurement设为 240,因为 SLO 度量 7 天滚动窗口)
workers固定该分片的--workers=N(如SLO-Measurement因 SLO 回填 job 并发为 1 而钉死workers: 1

管理规格的工程约定包括:禁用用例不删除而是移入disabled数组并附原因;同一 spec 不能同时出现在run_filesdisabled中(构建会失败);_前缀键被忽略,可用于自由备注。


十、从零开始运行一套 UI 测试的完整清单

综合以上全部内容,在本地跑通一套 OpenObserve UI 自动化测试的最小步骤:

# 1. 安装依赖 cd tests/ui-testing && npm install # 2. 配置环境变量(任选一种) # 方式 A:写入 .env 文件 cat > .env <<'EOF' ZO_BASE_URL=http://localhost:5080 ZO_ROOT_USER_EMAIL=root@example.com ZO_ROOT_USER_PASSWORD=rootpass ORGNAME=default EOF # 方式 B:从 CI 工作流导出(若存在 .github/workflows/playwright.yml) source env.sh # 方式 C:命令行内联 # ZO_BASE_URL=... ZO_ROOT_USER_EMAIL=... ZO_ROOT_USER_PASSWORD=... ORGNAME=... npx playwright test # 3. 运行 npx playwright test # 全量 npx playwright test -g @alertsImportExport # 按标签 npx playwright test --headed Alerts/alerts-import.spec.js # 单个文件 + 有头调试 # 4. 查看报告 npx playwright show-report playwright-results/html-report

运行过程中你可以观察:全局 Setup 会先自动登录并注入日志/追踪/RUM 测试数据(e2e_automate流),随后各分片并行执行用例;失败时可在 CI 产物中获取截图、视频与 Trace 进行根因分析。这套体系将 OpenObserve 前端数百个页面的功能回归、数据链路验证与 CI 质量门禁统一收口到了 playwright.config.js 一份配置驱动的可重复流程中,是理解并扩展 OpenObserve 前端质量保障体系的入口。

【免费下载链接】openobserveOpen source observability platform for logs, metrics, traces, RUM, Session replay, pipelines, SLO and LLM observability. A sophisticated, simple and highly performant alternative to Datadog, Splunk, and Elasticsearch with 140x lower storage costs and single binary deployment.项目地址: https://gitcode.com/GitHub_Trending/op/openobserve

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询