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(邮件/云服务集成)、uuid、date-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_URL | OpenObserve 实例地址(同时作为baseURL,供page.goto('/')使用) |
ZO_ROOT_USER_EMAIL | 根用户邮箱,用于登录 |
ZO_ROOT_USER_PASSWORD | 根用户密码 |
4.2 常用可选环境变量
| 变量 | 含义 | 依据 |
|---|---|---|
ORGNAME | 组织标识,登录时通过?org_identifier=参数建立组织上下文 | global-setup.js |
INGESTION_URL | 数据注入使用的 API 地址,默认回退到ZO_BASE_URL | global-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):
- 引入
dotenv并执行dotenv.config(),自动读取测试目录下的.env文件; - 若 dotenv 不可用,回退到系统环境变量;
- 加载完成后校验必备变量,缺失时在控制台输出告警信息。
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 | 说明 |
|---|---|---|---|
timeout | 3 分钟 | 5 分钟 | 单个测试用例超时 |
expect.timeout | 10 秒 | 30 秒 | 断言(expect)超时 |
navigationTimeout | 30 秒 | 90 秒 | 页面导航超时 |
actionTimeout | 15 秒 | 45 秒 | 动作(点击、输入等)超时 |
globalTimeout | 无 | 40 分钟 | 整个测试运行的总时间上限 |
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:一次登录、全局注入数据
测试套件通过globalSetup与globalTeardown钩子实现"运行前统一准备、运行后统一清理"。
6.1 全局 Setup 流程(global-setup.js)
整个套件只执行一次的初始化,包含四大步骤:
- 建立组织上下文登录:跳转
${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 前端组件约定深度绑定的关键细节。 - 登录成功校验:等待
[data-test="navbar-main-nav"]主导航栏出现即视为登录成功,并保存认证状态到playwright-tests/utils/auth/user.json,后续所有测试上下文复用该 storageState,避免每个用例重复登录。 - 全局日志数据注入:通过
POST ${INGESTION_URL}/api/${ORGNAME}/e2e_automate/_json接口(Basic Auth)将 tests/test-data/logs_data.json 中的日志批量注入到e2e_automate流,返回非 200 即判定失败。 - 追踪与 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_automate、e2e_matchall)、Kubernetes 语义字段名(kubernetes_pod_name、kubernetes_namespace等)、SQL 查询模板(SUBQUERY / CTE / GROUP_BY)与测试优先级 P0/P1/P2。
8.3 可视化辅助工具
utils/ 中还有一批值得复用的工程化助手:MonacoEditorHelper.js(操作查询编辑器)、webhook-capture.js(捕获 Webhook 请求用于告警链路断言)、slack-reporter.js(Slack 通知)、zip-builder.js、mail-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_folder | playwright-tests/下的真实目录 |
browser | 浏览器(chrome) |
run_files | 该分片运行的 spec 文件名列表 |
disabled | 有意关闭的用例(保留记录,可 git 追溯) |
quick_mode_enabled | 以ZO_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_files与disabled中(构建会失败);_前缀键被忽略,可用于自由备注。
十、从零开始运行一套 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),仅供参考