Rocket.Chat 联邦Federation端到端测试指南基于 Playwright 的跨 Matrix 实例测试体系【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat本篇指南围绕仓库中 apps/meteor/tests/e2e/federation/README.md 展开系统讲解 Rocket.Chat 联邦Federation能力所配套的 Playwright 端到端E2E测试体系如何准备两个甚至三个相互隔离的 Rocket.Chat 实例与 Matrix 域名、如何通过一条环境变量命令拉起整套跨服务器测试以及速率限制Rate Limiter等前置条件为什么必不可少。读完本文你将能独立复现联邦场景下频道、私聊、消息、线程与管理后台的自动化验证流程并理解其底层测试基建的实现原理。一、背景为什么需要跨实例的联邦 E2E 测试Rocket.Chat 的联邦能力使其不同服务器之间能够基于 Matrix 协议互联互通例如 A 服务器的用户可以直接与 B 服务器的用户私聊、拉人进频道。这类跨进程、跨域名的行为用单实例单元测试很难覆盖真实链路因此仓库在 apps/meteor/tests/e2e/federation 目录下维护了一套独立的 Playwright E2E 套件用真实浏览器驱动两个或更多Rocket.Chat 站点完成交互级验证。围绕该功能仓库还提供了配套的 Matrix 联邦测试编排脚手架如 ee/packages/federation-matrix 下的docker-compose.test.ymlE2E 用例假设测试环境已经存在可互通的联邦服务器与各自独立的 Matrix homeserver 域名。二、测试套件全景目录结构与运行入口联邦 E2E 套件位于 apps/meteor/tests/e2e/federation内部按职责划分清晰目录 / 文件职责config/global-setup.tsPlaywright 全局启动钩子校验全部必需环境变量config/constants.ts把RC_SERVER_*环境变量解析为服务器配置对象utils/test.ts扩展 Playwrighttest注入apiServer1/apiServer2两个 REST API fixture并提供setupTesting/tearDownTesting环境开关utils/auth.ts页面级登录助手doLogin支持保存登录态storageStateutils/register-user.ts通过 REST 接口批量注册新用户utils/format.ts把用户名与域名格式化为 Matrix 完整 IDuser:domainutils/channel.ts频道创建与跨服邀请等复合操作page-objects/面向对象封装admin.ts、channel.ts及各 UI 区域 fragmenttests/按功能域组织的 spec 用例files/视频/音频/图片/PDF 等测试媒体素材运行入口在 apps/meteor/package.json 中定义test:e2e:federation: playwright test --configplaywright-federation.config.ts即通过专门的 playwright-federation.config.ts 运行而不是默认的playwright.config.ts。三、运行联邦 E2E 测试环境变量与启动命令原文档给出的核心启动方式是在仓库根目录或apps/meteor下为测试进程注入两组服务器配置再调用yarn run test:e2e:federation$ RC_SERVER_1http://localhost:3000 RC_SERVER_1_ADMIN_USERtest RC_SERVER_1_ADMIN_PASSWORDtest RC_SERVER_1_MATRIX_SERVER_NAMEmy.matrix.server \ RC_SERVER_2http://localhost:3000 RC_SERVER_2_ADMIN_USERtest2 RC_SERVER_2_ADMIN_PASSWORDtest RC_SERVER_2_MATRIX_SERVER_NAMEmy2.matrix.server \ yarn run test:e2e:federation3.1 每个环境变量控制什么对照 config/constants.ts 的映射逻辑可以精确理解每条变量的语义环境变量用途备注RC_SERVER_1/RC_SERVER_2两台 Rocket.Chat 实例的 HTTP 访问地址代码中默认回退为http://localhost:3000RC_SERVER_1_ADMIN_USER实例 1 的管理员账号用于 REST 登录与后续管理操作RC_SERVER_1_ADMIN_PASSWORD实例 1 的管理员密码RC_SERVER_1_MATRIX_SERVER_NAME实例 1 所属 Matrix homeserver 域名参与构造联邦用户完整 IDRC_SERVER_2_ADMIN_USER/RC_SERVER_2_ADMIN_PASSWORD实例 2 的管理员凭据RC_SERVER_2_MATRIX_SERVER_NAME实例 2 所属 Matrix 域名RC_EXTRA_SERVER及RC_EXTRA_SERVER_ADMIN_USER/PASSWORD/MATRIX_SERVER_NAME预留的第三个测试实例供需要三实例才能覆盖的场景使用MATRIX_SERVER_NAME并非直接用于页面跳转而是作为联邦域后缀用例通过 utils/format.ts 将普通用户名拼装为 Matrix 全量用户名——formatUsernameAndDomainIntoMatrixFormat(username, domain)产出user:domainformatIntoFullMatrixUsername再补充前缀得到user:domain。例如实例 2 的用户abc在实例 1 侧会被表示为abc:my2.matrix.server。3.2 环境变量校验global-setup 会强制拦截原文档示例只覆盖了两台服务器的 8 个变量但当前的全局启动钩子 config/global-setup.ts 实际校验的变量多达 12 个——在示例之外还必须提供RC_EXTRA_SERVER、RC_EXTRA_SERVER_ADMIN_USER、RC_EXTRA_SERVER_ADMIN_PASSWORD、RC_EXTRA_SERVER_MATRIX_SERVER_NAME。若任一缺失Playwright 会在启动阶段抛出Missing required environment variables: ...因此在实际执行时尤其是用较新版本仓库跑用例建议把示例命令补齐为同时携带RC_EXTRA_SERVER三件套的完整写法避免 global-setup 直接终止运行。四、被 README 特别标注的前置条件注册接口速率限制原文档以 Important 单独强调了一个高频踩坑点请在 管理Admin Rate Limiter速率限制 Feature limiting功能限制中提高用户注册接口的速率限制上限。这是必须的因为测试会用程序化方式批量注册新用户。这条提示与源码中的实测逻辑完全吻合utils/test.ts 的setupTesting会通过 REST 设置接口一次性关闭/放宽测试期间的各类限流并在结束后用tearDownTesting恢复默认值关闭 API 级限流API_Enable_Rate_Limiterfalse并将Rate_Limiter_Limit_RegisterUser调高到10关闭 DDP 层的 IP / 用户 / 连接维度的限流开关如DDP_Rate_Limit_IP_Enabledfalse关闭Accounts_ManuallyApproveNewUsers新用户免人工审批并把注册表单设为Accounts_RegistrationFormPublic保证/users.register接口可被匿名调用测试结束后tearDownTesting会将上述开关逐一还原注册限流回到1、注册表单回到Disabled、审批回到开启。由此可见无论走后台界面手调还是依赖用例内嵌的setupTesting放开注册限流都是联邦套件能跑起来的前提——大量用例都需要临时造出对方服务器上的全新用户。五、测试基建如何运转从配置到用例的完整链路5.1 专用 Playwright 配置与通用 E2E 不同联邦套件使用 playwright-federation.config.ts几个关键设计值得注意globalSetup指向联邦套件自带的config/global-setup.ts用于在用例开始前统一校验环境变量testDir: tests/e2e/federation限定只执行联邦目录下的用例workers: 1串行执行retries: 2自动重试失败用例timeout: 60 * 2000即 120 秒/用例充分照顾跨服务器同步的慢链路headless: truechannel: chrome使用真实 Chrome需本机装有 Chrome启动参数中通过--use-glegl强制启用 GPU 加速headless 下也生效并通过--use-file-for-fake-video-capturetests/e2e/federation/files/video_mock_for_webcam.y4m与--use-file-for-fake-audio-capturefiles/audio_mock.wav注入伪造的摄像头/麦克风输入流——这正是 files 目录中媒体素材的用途trace: retain-on-failure、screenshot: only-on-failure失败产物输出到outputDir: tests/e2e/.playwright。5.2 服务器配置对象config/constants.ts 将环境变量封装为RC_SERVER_1、RC_SERVER_2、RC_EXTRA_SERVER三个配置对象每个都含url / username / password / matrixServerName四个字段供页面导航、REST 登录与联邦 ID 拼装三处共用。5.3 REST 层 fixtureapiServer1 / apiServer2utils/test.ts 基于 Playwright 的requestfixture 扩展出apiServer1/apiServer2先用管理员账号向登录接口发起请求换取data.authToken与data.userId再封装出携带X-Auth-Token、X-User-Id请求头的get/post/put/delete方法。这样 spec 就能用管理 API 直调 浏览器 UI 操作双通道来搭建与断言跨服场景。5.4 用户注册与登录utils/register-user.ts用faker生成 UUID 用户名POST 到/users.register邮箱形如uuidtest-rc.com返回新用户名——这就是 README 中程序化注册新用户的具体实现utils/auth.tsdoLogin打开url/login按roletextbox[name/username/i]与[namepassword]定位输入框完成登录开启storeState时会把会话落盘为storageNamePrefix-session.json用于多页面复用登录态。5.5 Page Object 封装UI 操作被收敛进 page-object 层。以 page-objects/channel.ts 为例FederationChannel组合了内容区content、侧边栏sidenav、顶栏navbar、侧拉面板tabs等多个 fragment并提供语义化动作如createPublicChannelAndInviteUsersUsingCreationModal创建联邦公共频道并邀请远端用户、createPrivateGroupAndInviteUsersUsingCreationModal私有群组等还能通过[data-qafederated-origin-server-name]读取当前房间所属的联邦来源服务器名。fragment 型 page object 放在page-objects/fragments/下与通用 E2E 套件复用。六、测试覆盖范围跨服功能用例一览联邦用例按被测能力组织在tests/下可在 tests 目录逐一查阅用例目录覆盖能力channel/public.spec.ts联邦公共频道的创建、跨服成员管理、订阅与访客场景channel/private.spec.ts私有群组/私有频道在联邦场景下的可见性与成员权限channel/dm.spec.ts直接消息邀请对方服务器尚不存在的用户、跨服 DM 收发等对 Matrix 域名的使用最密集messaging/public/private/dm.spec.ts公共/私有/DM 房间内的跨服消息发送、编辑、删除与引用messaging/threads.spec.ts跨服务器环境下的消息线程thread行为admin/rooms.spec.ts、admin/users.spec.ts管理员视角对联邦房间与远程用户的统一管理user-account/user.spec.ts普通用户在联邦配置下的账号侧行为ce-version/ce.spec.ts社区版Community Edition下联邦能力的边界验证以 tests/channel/dm.spec.ts 为例可以看到一套典型的跨服用例模板beforeAll中先对两台服务器执行setupTesting(apiServer1/apiServer2)再各自registerUser注册远端用户随后用formatIntoFullMatrixUsername(user, matrixServerName)拼出完整联邦 ID 并完成邀请前置每个测试用例再通过doLogin与 page object 完成 UI 驱动afterAll统一调用tearDownTesting还原配置。这从用例层印证了前面 README 提到的限流与注册设置为何是关键前提。七、失败排查与产物解读套件为联邦类慢链路做了工程化兜底单用例失败会自动重试 2 次retries: 2降低跨服时序抖动导致的偶发失败失败时保留 Playwright traceretain-on-failure与页面截图统一输出到tests/e2e/.playwright目录可用npx playwright show-trace打开 trace 逐帧回放操作与网络请求全局workers: 1意味着多实例测试共享同一浏览器/服务器状态时不会互相抢占资源。排查时优先核对三点是否按 global-setup 要求补齐了全部 12 个环境变量两套实例的MATRIX_SERVER_NAME是否与各自 Matrix homeserver 实际域名一致否则拼出的user:domain无法路由测试实例的注册接口限流是否已放开。八、总结这套联邦 E2E 体系的价值在于用双实例 真实浏览器 REST 通道完整复现了 Rocket.Chat 跨 Matrix 服务器的核心链路——建房间、邀请远端用户、跨服消息/线程、管理员治理。原文档虽短但它的两条核心信息多服务器环境变量启动方式、注册接口限流注意事项分别对应着global-setup的强校验与setupTesting/tearDownTesting的配置自动切换。理解这层关系后无论是本地复现、CI 接入还是扩展新的联邦用例都能直接对照 apps/meteor/tests/e2e/federation 目录下的源码与 playwright-federation.config.ts 配置快速定位。【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考