
Baserow 端到端测试实战用 just e2e 编排 Playwright 全栈 UI 测试【免费下载链接】baserowBuild databases, automations, apps agents with AI — no code. Open source platform available on cloud and self-hosted. GDPR, HIPAA, SOC 2 compliant. Best Airtable alternative.项目地址: https://gitcode.com/GitHub_Trending/ba/baserowBaserow 仓库内置了一套位于e2e-tests目录的 Playwright 端到端测试套件它面向一个真实运行的 Baserow 全栈环境PostgreSQL Redis 后端 Celery 前端驱动浏览器完成 UI 级验证。读完本文你将掌握如何用just e2e系列命令一键完成“构建镜像 → 拉起隔离环境 → 跑测试 → 清理”的完整循环理解其背后的数据库 dump 加速机制、tmpfs 内存存储与端口隔离设计并能结合 e2e-tests/justfile、e2e-tests/playwright.config.ts 等源码定位自定义端口、环境变量与失败调试的具体落点。前置条件运行 E2E 环境需要以下四个工具Docker—— 用于运行 E2E 环境Node.js—— 用于运行 Playwright 测试Yarn—— 包管理器just—— 命令运行器。最低版本要求参见 supported.md。可以用以下命令逐一验证安装# Verify installation docker --version node -v yarn -v just --version快速上手# Full E2E cycle: build images, start environment, run tests, stop just e2e run # Or step by step: just e2e build # Build CI images just e2e up # Start E2E environment just e2e test # Run tests just e2e down # Stop and cleanup测试运行期间的访问入口Frontend:http://localhost:3070Backend API:http://localhost:8070E2E 栈刻意选用3070/8070作为默认端口以避开默认开发栈3000/8000和文档中记录的两个备用开发栈3010/8010与3020/8020同时把3030–3060/8030–8060留给额外的开发实例。这个端口规划在源码里可以直接对上e2e-tests/justfile 通过env_var_or_default(E2E_BACKEND_PORT, 8070)和env_var_or_default(E2E_FRONTEND_PORT, 3070)定义默认值注释中明确说明了“Keep these well above the documented dev ranges so 8030-8060/3030-3060 stay free for additional dev instances”。命令参考命令说明just e2e build构建后端与前端的 CI 镜像just e2e up启动 E2E 环境db、redis、backend、frontend 等just e2e down停止并移除所有 E2E 容器just e2e test运行全部 E2E 测试just e2e test args带 Playwright 参数运行测试just e2e run完整循环build → up → test → downjust e2e logs查看全部容器日志just e2e logs service查看指定服务的日志just e2e db-dump生成新的数据库 dumpjust e2e db-restore container把 dump 恢复到某个 PostgreSQL 容器这里的just e2e其实是根 justfile 中的一个“代理”just e2e *ARGS的实现是just --justfile e2e-tests/justfile {{ ARGS }}即把参数原样转发给 e2e-tests/justfile 执行。因此所有 E2E 命令的完整实现镜像名、容器编排、dump 恢复逻辑都集中在后者的build、up、test、down、logs、db-dump、db-restore等 recipe 中。运行示例运行特定测试# Run a specific test file just e2e test tests/auth/login.spec.ts just e2e test tests/database/search.spec.ts # Run all tests in a directory just e2e test tests/database/ just e2e test tests/builder/ # Run tests matching a pattern just e2e test --grep login # Run in headed mode (see the browser) just e2e test --headed # Run in UI mode (interactive debugging) just e2e test --ui # Run only in Chrome just e2e test --projectchromium测试按功能域组织在e2e-tests/tests/下与上面的示例一一对应认证类在 tests/auth/login.spec.ts数据库 UI 交互搜索、表格导入、富文本、按钮字段、表单视图等在e2e-tests/tests/database/应用构建器Builder在e2e-tests/tests/builder/自动化Automation在e2e-tests/tests/automation/此外还有 tests/enterprise/regressions.spec.ts 与 tests/premium/view_ownership_permissions.spec.ts 等按模块划分的用例。查看日志# All logs just e2e logs # Specific service just e2e logs backend just e2e logs frontend just e2e logs db just e2e logs celery从 e2e-tests/justfile 的实现看just e2e logs不带参数时会交错输出e2e-backend与e2e-frontend的日志分别打上[backend]/[frontend]前缀带参数时则直接执行docker logs -f e2e-{{ SERVICE }}所以任意以e2e-为前缀的容器名db、redis、celery、mail等都可以作为 service 参数。调试失败测试# Start environment without running tests just e2e up # Run tests in UI mode for debugging just e2e test --ui # Or run specific failing test with trace just e2e test tests/mytest.spec.ts --trace on # Keep environment running for manual inspection # Access http://localhost:3070 in your browser这里有一个值得注意的细节testrecipe 通过trap cleanup EXIT在退出时无论成功或失败自动执行just down拆掉环境见 e2e-tests/justfile 的注释 “tears down containers when done”。如果希望“保持环境运行以便手工检查”正确姿势是先单独just e2e up手动拉起环境、直接用yarn playwright test ...在e2e-tests/下运行绕过会自动拆环境的just e2e test。另外e2e-tests/playwright.config.ts 默认配置了trace: on-first-retry与video: on-first-retry即测试首次重试失败时自动采集 trace 与录像可配合--ui/ trace viewer 使用。重新生成数据库 Dump当迁移migration发生变化时需要重新生成 E2E 数据库 dump# Generate new dump with latest migrations just e2e db-dump # Commit the updated dump git add e2e-tests/fixtures/e2e-db.dump git commit -m Update E2E database dumpdb-dump的实际流程见 e2e-tests/justfile是在独立的e2e-dump-net网络里启动pgvector/pgvector:pg14版本可经POSTGRES_IMAGE_VERSION覆盖与 Redis 容器用后端 CI 镜像以DJANGO_SETTINGS_MODULEbaserow.config.settings.test只执行migrate --noinput跑完全部迁移不导入模板数据最后用pg_dump -U baserow -Fc baserow生成自定义格式 dump 写入 e2e-tests/fixtures/e2e-db.dump。模板数据不进入 dump而是在 E2E 启动时的post_migrate信号中按需同步——这一设计由后端配置 backend/src/baserow/config/settings/e2e.py 印证BASEROW_TRIGGER_SYNC_TEMPLATES_AFTER_MIGRATION False关闭全量模板同步改用sync_templates_only_for_e2e只同步DEFAULT_APPLICATION_TEMPLATES中列出的模板以缩短 CI 启动时间。db-restore container则是通用工具对任意运行中的 PostgreSQL 容器执行 “DROP DATABASE IF EXISTS → CREATE DATABASE → pg_restore --no-owner --no-acl”可用于把同一份 dump 恢复到其他容器。工作原理E2E 环境依赖四块基础设施预构建的 CI 镜像—— 后端与前端使用带测试依赖的 CI 镜像镜像名分别为baserow/backend:ci与baserow/web-frontend:ci与根 justfile 的just build backend ci/just build web-frontend ci产物一致数据库 dump—— 预迁移完成的数据库在启动时直接恢复跳过逐条跑迁移的耗时tmpfs 存储—— PostgreSQL 数据目录2G与 Redis 数据目录256m挂载在内存文件系统上加速启动与 I/O隔离网络—— 所有容器位于baserow-e2e网络中与开发环境互不干扰。容器架构┌─────────────────────────────────────────────────────────┐ │ baserow-e2e network │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ e2e-db │ │e2e-redis │ │e2e-backend│ │e2e-celery│ │ │ │ (tmpfs) │ │ (tmpfs) │ │ :8000 │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │ │ │ │ │ ┌──────────────┐ │ │ │ e2e-frontend │ │ │ │ :3000 │ │ │ └──────────────┘ │ └─────────────────────────────────────────────────────────┘ │ Playwright tests图中的容器名与网络名可直接在 e2e-tests/justfile 中找到对应常量network : baserow-e2e、db_image、redis_image等。实际上up启动的容器比架构图更多为了让测试不依赖外网还额外拉起了三个“替身”服务e2e-httpbinkennethreitz/httpbin按 digest 锁定版本——回答按钮字段 HTTP 动作发出的请求使整套测试离线可跑e2e-slack-stubwiremock/wiremock:3.13.1——把 e2e-tests/stubs/slack 目录以只读方式挂载进容器模拟 Slack API 的chat.postMessage响应。该目录自带说明文档默认响应返回固定ts供测试断言而chat_post_message_slow.json针对slow频道延迟 8 秒响应专门用于测试“第一个请求还在处理中时第二次点击会被锁拒绝”的并发场景e2e-mailmailhog/mailhog:v10.1API 端口默认8075映射到宿主——捕获邮件动作发出的邮件测试通过 MailHog API 回读验证。backend 与 celery 容器通过一个名为e2e-media的 tmpfs 命名卷共享/baserow/media512muid/gid 9999。backend 容器还有一组关键环境变量DJANGO_SETTINGS_MODULEbaserow.config.settings.e2e指定专门的 E2E 设置模块MIGRATE_ON_STARTUPtrue让启动时对已恢复的 dump 应用增量迁移FEATURE_FLAGS*开启全部特性BASEROW_INTEGRATIONS_SLACK_API_URL指向 Slack 替身EMAIL_SMTP指向 MailHogBASEROW_DATABASE_BUTTON_DISPATCH_USER_RATE_LIMITS3/m把按钮字段的外部点击限流调低使“点击直到被拒绝”类测试几秒内即可触发BASEROW_FRONTEND_COOKIE_PREFIXbaserow_e2e_为 E2E 前端的认证 cookie 加前缀避免与同一宿主上的其他实例冲突详见下文环境变量表。后端就绪检查由 e2e-tests/wait-for-services.sh 完成它轮询前端/_health/、后端/api/_health/两个健康端点并额外校验/api/templates/中已同步出DEFAULT_APPLICATION_TEMPLATES与 backend/src/baserow/config/settings/base.py 保持一致的project-tracker、ab_ivory_theme——这正对应上面提到的“dump 只含迁移、模板由 post_migrate 信号同步”的设计。脚本默认最多等待 60 秒BASEROW_E2E_STARTUP_MAX_WAIT_TIME_SECONDS可调超时则让测试直接失败。环境变量与配置环境变量变量说明默认值E2E_FRONTEND_PORTjust e2e up发布到宿主的 frontend 端口3070E2E_BACKEND_PORTjust e2e up发布到宿主的 backend API 端口8070E2E_FRONTEND_COOKIE_PREFIXE2E 前端使用的 cookie 前缀避免同宿主认证 cookie 冲突baserow_e2e_PUBLIC_WEB_FRONTEND_URL测试使用的前端 URLhttp://localhost:3070PUBLIC_BACKEND_URL测试使用的后端 API URLhttp://localhost:8070BASEROW_BUILDER_PREVIEW_URL测试使用的 Builder 预览 URL同PUBLIC_WEB_FRONTEND_URLBASEROW_FRONTEND_COOKIE_PREFIXPlaywright 辅助函数直接写前端 cookie 时期望的 cookie 前缀baserow_e2e_这些变量可以写在e2e-tests/.env中参考 .env-example。示例文件本身就是一份可直接复制的默认值清单PUBLIC_BACKEND_URLhttp://localhost:8070 PUBLIC_WEB_FRONTEND_URLhttp://localhost:3070 BASEROW_BUILDER_PREVIEW_URLhttp://localhost:3070 BASEROW_FRONTEND_COOKIE_PREFIXbaserow_e2e_注意本地运行时不要设置CI环境变量。CI 使用系统安装的 Google Chromechannel: chrome而本地运行使用 Playwright 自管的 Chromium 二进制——这一差异体现在 e2e-tests/playwright.config.ts 的 chrome 项目定义...(process.env.CI ? { channel: chrome } : {})中。e2e-tests/README.md 还补充了一组针对“旧工作流”对开发栈跑测试的变量E2E_MAIL_API_URL/BASEROW_MAILHOG_WEB_PORT读取发出邮件的 MailHog API 地址备用开发实例 A/B 分别发布在 8035/8045、E2E_SLACK_STUB设为yes表示被测后端已指向 WireMock 替身否则点击类 Slack 测试会被跳过、E2E_HTTP_STUB_URLHTTP 动作测试调用的端点与E2E_BUTTON_RATE_LIMIT未设置时“点击直到被拒”类测试会被跳过。跨域测试 Builder 预览要在兄弟开发域名之间测试 Builder 预览先在/etc/hosts中把域名映射到127.0.0.1127.0.0.1 app.baserow.test api.baserow.test preview.baserow.test然后在e2e-tests/.env中使用如下值。E2E_*_PORT变量仍然控制 Docker 发布哪些宿主端口PUBLIC_WEB_FRONTEND_URLhttp://app.baserow.test:3070 PUBLIC_BACKEND_URLhttp://api.baserow.test:8070 BASEROW_BUILDER_PREVIEW_URLhttp://preview.baserow.test:3070Playwright 配置浏览器配置、超时、重试与 reporter 均集中在 e2e-tests/playwright.config.ts。关键取值如下可直接据此调整testDir指向e2e-tests/tests单测超时timeout: 30 * 1000expect断言等待超时 10 秒fullyParallel: trueworkers本地 3 个、CI 上为 1 个串行retriesCI 3 次、本地 0 次forbidOnly仅在 CI 生效防止把test.only误提交进主干reporterCI 用blobhtml本地用list项目projectschrome与firefox两个桌面设备配置。本地yarn run test实际只跑--projectchrome见 e2e-tests/package.json 的 scriptsCI 则通过yarn test-ciCI1 playwright test --grep-invertslow排除slow标记用例另有test-fast-only--grep fast、test-enterprise-only--grep enterprise等按标签筛选的脚本use.nuxt.fixture: false显式禁用 fixture 加载声明测试针对的是“运行中的服务器而非本地 Nuxt 应用”导航使用nuxt/test-utils的gotohydration 等待实现页面基类封装在 e2e-tests/pages/baserowPage.ts并对 Firefox 的NS_BINDING_ABORTED导航中断做了自动重试。编写测试测试生成Playwright 可以帮你生成测试骨架cd e2e-tests yarn codegen会打开一个浏览器把你的操作录制为测试代码。把它当作起点用后再对生成代码做清理。最佳实践使用页面对象page object模式组织可复用组件显式等待元素而不是用固定超时用data-testid属性作为可靠的选择器测试结束后尽可能清理测试数据。仓库本身就是这些实践的参照系e2e-tests/pages/ 下的BaserowPage、loginPage.ts、workspacePage.ts等封装了导航与认证动作例如authenticate()通过?tokenrefreshToken完成登录态注入e2e-tests/fixtures/user.ts 提供基于 API 的用户创建/认证 fixture含一个预置的e2ebaserow.iostaff 用户供需要管理员权限的 fixture 使用e2e-tests/client.ts 则用 axios 构造携带 JWT 的 API 客户端供 fixture 与测试直接调用后端 REST API——这正是文档所说“API 序列化边界前后端集成”测试的常用手段。什么情况下值得写 E2E 测试考虑为以下场景补充 E2E 用例多服务 UX 流程—— 例如复制duplicate一个数据库复杂的前端交互—— 难以用单元测试覆盖的行为API 序列化边界—— 前后端集成的契约验证关键功能—— 经常在跨浏览器场景下出问题的特性跨浏览器问题—— 特定浏览器的 bug。现有用例恰好是这几类的实例tests/database/realtimeReplay.spec.ts 验证实时回放配合 e2e 设置里的BASEROW_REALTIME_REPLAY_MAX_EVENTS 100限定了事件规模tests/database/button_field_slack.spec.ts 借助 Slack 替身验证按钮字段点击写入与并发锁tests/database/button_field_email.spec.ts 借助 MailHog 回读邮件tests/builder/覆盖构建器页面、预览与模板流程。已弃用旧工作流注意以下命令已弃用请改用just e2e系列命令。# Using dev.sh (deprecated) ./dev.sh cd e2e-tests ./run-e2e-tests-locally.sh # Manual yarn commands still work if environment is running: yarn test # headless yarn test-headed # see browser yarn test-ui # interactive debugging yarn codegen # generate test code这些方式仍然可用但需要你自行维护开发环境。从 e2e-tests/run-e2e-tests-locally.sh 看旧脚本默认把测试指向开发栈的3000/8000且不带 cookie 前缀除非显式覆盖PUBLIC_*/BASEROW_FRONTEND_COOKIE_PREFIX并在后端开启BASEROW_INTEGRATIONS_ALLOW_PRIVATE_ADDRESStrue时临时拉起本地 httpbin 替身——这正是文档中“对普通本地开发环境运行旧脚本时仍使用 3000/8000 和空 cookie 前缀”说明的实现来源。新的just e2e命令则自动处理了镜像、容器、dump、替身与清理的全部环节。小结Baserow 的 E2E 体系可以概括为一条链路根 justfile 把just e2e *转发到 e2e-tests/justfile后者用“CI 镜像 预迁移 dump tmpfs 隔离网络 离线替身httpbin / WireMock / MailHog”搭起一套可复现的全栈环境再由 playwright.config.ts 定义的 chrome/firefox 双项目跑完用例并自动拆环境。当你需要改端口、换 URL 或调整 cookie 前缀时改e2e-tests/.env迁移变化时重新just e2e db-dump并提交 e2e-tests/fixtures/e2e-db.dump写新用例时则参照pages/、fixtures/与tests/下的既有模式即可。【免费下载链接】baserowBuild databases, automations, apps agents with AI — no code. Open source platform available on cloud and self-hosted. GDPR, HIPAA, SOC 2 compliant. Best Airtable alternative.项目地址: https://gitcode.com/GitHub_Trending/ba/baserow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考