Strapi 端到端测试的数据管理:基于 @strapi/data-transfer(DTS)重置与填充测试数据库

发布时间:2026/9/7 17:12:50
Strapi 端到端测试的数据管理:基于 @strapi/data-transfer(DTS)重置与填充测试数据库 Strapi 端到端测试的数据管理基于 strapi/data-transferDTS重置与填充测试数据库【免费下载链接】strapi Strapi is the leading open-source headless CMS. It’s 100% JavaScript/TypeScript, fully customizable, and developer-first.项目地址: https://gitcode.com/GitHub_Trending/st/strapi本篇指南基于 Strapi 仓库的 e2e 贡献者文档讲明仓库如何使用strapi/data-transfer下称 DTS为 Playwright 端到端测试重置并填充数据库为什么选择 DTS 而不是自建 API 端点、fixture 数据包data packet的目录布局与 Git 可审查性、导入/导出脚本的完整操作步骤以及resetDatabaseAndImportDataFromPath等测试期编程抽象的源码级实现。读完本文你能够独立维护tests/e2e/data下的数据包为新增 e2e 用例导出并导入符合测试预期的初始数据并理解导入引擎的类型过滤、认证与恢复策略是如何落地的。为什么用 Data Transfer 重置与填充 e2e 数据库端到端测试需要一个“纯净”且可重复的初始数据库。理论上可以直接调用被测应用自身的 API 端点来造数但这套方案大概率要为每个 schema 的条目编写专门的造数代码维护成本高。Strapi 自4.6.0起发布了 DTSData Transfer System能力任何 Strapi 实例都能把自身数据导出为一个数据包从而可以程序化地把数据库恢复到“这一时刻”的快照得到确定性的测试环境。在 Strapi 仓库中e2e fixture 以解包后的导出目录形式存放在 tests/e2e/data当前仓库中已有with-admin/与without-admin/两个数据包。其布局与 Strapi 导出的.tar内部结构一致包含metadata.json导出元信息如 Strapi 版本、创建时间schemas/、entities/、links/内容类型结构、实体数据与关系链接configuration/应用配置coreStore 等assets/媒体资源。采用“解包目录”而非 tar 归档提交 Git是为了让 JSON 与 JSONL 的变更在 Git 中以普通文本 diff 呈现、便于 Code Review二进制媒体统一放在assets/uploads/下该目录被 Prettier 忽略。限制与注意事项对数据包的修改仍需谨慎——数据库的未知变更可能波及其他测试。更新 fixture 时应逐一审视 JSONL 与 metadata 的 diff。这一点与 tests/e2e/README.md 的整体约定一致E2E 共享tests/app-template应用模板与统一 runnertests/scripts/run-tests.js数据维护则遵循本文档的工作流。测试隔离原则每个用例都从同一份数据出发每个 e2e 测试都应是相互隔离的不能依赖其他测试的副作用——如果一个用例创建了某内容类型的新条目下一个用例中该条目不应存在。这样测试更稳定、也更容易排查问题。DTS 导入正是实现这种隔离的手段在beforeEach或等价的一次性共享 setup中把数据库重置为同一份数据包。数据转移引擎为测试定制的 DTS 引擎仓库明确约定不要直接对被测的 Strapi 实例使用 CLI 的import/export命令。因为 CLI 默认走strapi/data-transfer的通用行为不会导入/导出管理员用户、API Token 等处于其排除列表中的条目而 e2e 测试恰恰需要这些数据例如用管理员账号登录。因此仓库专门编写了自己的 DTS 引擎与辅助脚本导入助手tests/utils/dts-import.ts导出助手tests/utils/dts-export.ts允许传输的内容类型清单tests/e2e/constants.ts类型白名单 ALLOWED_CONTENT_TYPES导入与导出都围绕 tests/e2e/constants.ts#L32-L59 中的ALLOWED_CONTENT_TYPES展开其组成是管理端条目admin::user、admin::role、admin::permission、admin::api-token、admin::transfer-token这正是 CLI 默认排除、而测试必须保留的部分应用模板内容类型由脚本动态读取 tests/app-template/src/api 下所有src/api/name/content-types/ct目录生成形如api::author.author插件内容类型plugin::content-manager.history-version、plugin::i18n.locale、plugin::content-releases.release、plugin::content-releases.release-action、plugin::review-workflows.workflow-stage、plugin::review-workflows.workflow、plugin::upload.file、plugin::upload.folder。若数据包需要新增系统或插件内容类型必须在ALLOWED_CONTENT_TYPES中显式添加。导入实现的源码解析核心函数resetDatabaseAndImportDataFromPath位于 tests/utils/dts-import.ts#L69-L127。它的行为要点如下路径解析与源 provider 自动选择tests/utils/dts-import.ts#L245-L257传入的若不是绝对路径会相对tests/e2e/data/解析用statSync判断是目录还是文件——目录走createLocalDirectorySourceProvider对应解包后的数据包文件则走createLocalFileSourceProvider对应.tar包且显式关闭encryption与compression。远程目标 provider 与认证tests/utils/dts-import.ts#L259-L275使用createRemoteStrapiDestinationProvider指向http://127.0.0.1:${PORT}/admin认证方式为 tokenCUSTOM_TRANSFER_TOKEN_ACCESS_KEY定义在 tests/app-template 的src/constants传输策略为restore并开启assets: true、entities.include ALLOWED_CONTENT_TYPES、configuration: { coreStore: true }。引擎选项versionStrategy: ignore与schemaStrategy: ignoretransforms.links过滤掉两端不在白名单内的关系右端undefined的关系予以保留transforms.entities只保留白名单内的实体。传输前重置 transfer token在engine.transfer()之前先POST /api/config/resettransfertoken以防 token 已被上一次导入清空它本身可能不在导入数据中。PORT 契约被测实例地址依赖环境变量PORT见 tests/utils/dts-import.ts#L22-L42 的说明。yarn test:e2e运行时由 runner 注入PORT8000 序号手动执行npx ts-node dts-import.ts时脚本仅在PORT未设置时默认为8000第一个 test-app 槽位其余编程调用方必须自行设置。此外该文件还提供面向 CLI 测试的resetDatabaseAndImportDataFromPathProgrammatictests/utils/dts-import.ts#L140-L207它通过createStrapi加载 Strapi 实例但不起 HTTP 服务使用本地目标 provider 完成同样的“重置 导入”并在finally中destroy实例——适用于 Strapi 已加载但未作为服务器运行的 CLI 测试场景。resyncSuperAdminPermissionsAfterImporttests/utils/dts-import.ts#L44-L60则在导入后调用/api/config/permissions/resync-super-admin重建 Super Admin 权限。导出实现的源码解析tests/utils/dts-export.ts#L17-L83 的exportData加载当前 Strapi 实例后源端用createLocalStrapiSourceProvider目标端用createLocalFileDestinationProvidertests/utils/dts-export.ts#L92-L97文件路径即命令行参数给出的包名引擎选项与导入对称——versionStrategy/schemaStrategy均为ignoretransforms中同样按ALLOWED_CONTENT_TYPES过滤links与entities。导出完成后会打印导出结果摘要schemas / entities / links / assets / configs 数量。导入已有数据包完整操作步骤当你需要为某个新测试更新数据包时首先需要一个装载了当前 e2e 数据的 Strapi 应用实例运行yarn test:e2e时测试应用实例会生成在test-apps/e2e/test-app-{n}可任选其一更新数据进入该 test-app 目录执行yarn install yarn develop并保持开发服务器运行EE 功能前置若数据包涉及 EE 功能需与 e2e 使用相同的STRAPI_LICENSE——写入 tests/e2e/.env见 E2E 环境配置文档或在 shell 中 export 后再手动执行下面的dts-import/dts-export命令这两个脚本本身不会自动加载tests/e2e/.env执行导入脚本参数为 tests/e2e/data 下的数据包名STRAPI_LICENSElicense-with-ee-feature npx ts-node PATH_TO_SCRIPT/dts-import.ts with-admin该脚本会导入管理员用户以及 tests/e2e/constants.ts 中列出的全部内容类型。导入完成后应能用以下测试凭据登录该实例与 tests/e2e/constants.ts#L67-L74 中的ADMIN_EMAIL_ADDRESS/ADMIN_PASSWORD对应EmailPasswordtesttesting.comTesting123!此时你就拥有了与每个 e2e 测试开始时相同的 Strapi 实例数据可以在 CMS 中修改数据、为新数据包做准备。注意如果修改了任何内容 schema包括新增内容类型务必同步更新 app-template否则 DTS 导入会因目标实例中不存在这些 schema 而失败。导出更新后的数据包在测试实例中创建好新数据后需要将其导出以供 e2e 使用。运行目录为之前基于 test-app 模板创建的那个 Strapi 实例所在目录脚本接受备份目标文件名作为参数npx ts-node PATH_TO_SCRIPT/dts-export.ts updated-data-packet若导出的是 EE 功能相关数据需带上STRAPI_LICENSE环境变量STRAPI_LICENSElicense-with-ee-feature npx ts-node PATH_TO_SCRIPT/dts-export.ts updated-data-packet脚本会生成updated-data-packet.tar。接下来将其解压为一个目录布局与 Strapi 导出一致把该目录放到 tests/e2e/data 下例如tests/e2e/data/updated-data-packet/测试即可从该文件夹导入且变更可以文本 diff 的形式审查若 Git 中只保留解包后的目录树提交后删除.tar。在测试场景中编程导入数据包测试期导入的编程抽象即 tests/utils/dts-import.ts 中的resetDatabaseAndImportDataFromPath。传入 tests/e2e/data 下的目录名如with-admin即可也仍可直接传.tar文件路径助手会自动选择文件/目录源 provider。典型用法是在每个用例之前重置数据库import { test } from playwright/test; import { resetDatabaseAndImportDataFromPath } from ./utils/dts-import; test.describe(Strapi Application, () { test.beforeEach(async ({ page }) { await resetDatabaseAndImportDataFromPath(with-admin); await page.goto(/admin); }); test(a user should be able to..., async ({ page }) { // my test }); });真实用例中这套模式随处可见例如 tests/e2e/tests/content-manager/cloning.spec.ts#L18-L23beforeEach中先resetDatabaseAndImportDataFromPath(with-admin)再跳转/admin并调用login工具登录。对于 setup 成本较高且用例之间无副作用依赖的场景仓库还封装了 tests/utils/setup.ts 的sharedSetup通过importData选项指定数据包名配合resyncSuperAdminPermissions在导入后重建权限注册表resetAlways则让每个用例都强制重新执行 reset import适用于会创建内容类型等变更应用状态的测试。文档中对这种“只执行一次”的共享 setup 给出了明确警示它引入用例间执行顺序的依赖风险在 CI 重试时顺序不保证因此只应用于 setup 耗时显著且用例互不依赖的场景。小结维护 e2e 数据包的要点数据包以解包目录形式提交在 tests/e2e/dataJSON/JSONL 变更可审二进制媒体集中在assets/uploads/导入/导出统一走tests/utils下的 DTS 助手脚本与ALLOWED_CONTENT_TYPES白名单不要直接使用 CLI 的 import/export内容 schema 变更必须先更新 tests/app-template再重新生成数据包否则 DTS 导入会失败EE 相关数据包操作必须携带与 e2e 一致的STRAPI_LICENSE更新 fixture 时仔细审查 JSONL 与 metadata 的 diff避免数据变更悄悄影响其他测试。【免费下载链接】strapi Strapi is the leading open-source headless CMS. It’s 100% JavaScript/TypeScript, fully customizable, and developer-first.项目地址: https://gitcode.com/GitHub_Trending/st/strapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考