@app-studio/qa-db (英语)
createCheckpointStore, (中文(简体) ), createPgliteCheckpointAdapter 财务报告和审定财务报表
createPostgresCheckpointAdapter 将已验证的种子前缀保存为本地 DB
图像、栅栏作家和在重放重点之前恢复相容的检查站.
锁定跟踪数据库身份, 横跨检查; 恢复 API 校验闸门
执行。 见 检查站发展。 。 。 .
每个运行的测试数据库——真正的Postgres或嵌入式PGlite——创建,迁移, 以经核实的后置条件被截断,出道后弃去.
每跑一个数据库,没有记忆
替代的公约是“每次会议都指定自己的数据库名称”,以及 它失败了公约的方式。 共用一个数据库的两套套房 其他——幽灵401s,在单独通过的测试中"没有找到记录"——以及 在同一次复选中,当第二场课忘记规则时,审计必须 从头开始重做.
这里没有什么可记住的。 默认路径是安全路径 :
// tests/setup/test-db.ts
import { createTestDbGlobalSetup } from '@app-studio/qa-db';
import { execFileSync } from 'node:child_process';
export default createTestDbGlobalSetup({
mode: 'postgres',
prefix: 'myapp_test_run_',
adminUrl: process.env.POSTGRES_URL ?? 'postgres://localhost:5432/postgres',
applySchema: async ({ url }) => {
execFileSync('pnpm', ['prisma', 'db', 'push'], { env: { ...process.env, DATABASE_URL: url } });
},
});
// vitest.config.ts
export default { test: { globalSetup: ['tests/setup/test-db.ts'] } };
每次跑步都会 myapp_test_run_<pid>_<timestamp>被撕毁 数据库
6个多小时以上 被扫走的路上, 所以一个被杀死的跑道留下了碎片
一个下午,而不是永远.
TEST_DATABASE_URL 设置在外壳中仍然获胜,这就是CI如何针入a
服务数据库。 在任何 dotenv 装入前故意读取: 仓库
船舶共享默认值 .env 为方便起见,并尊重
完全恢复这个防止的碰撞. TEST_DB_KEEP=1 保存数据库
因此,失败可以打开之后.
PGlite 是一等模式, 不是倒置模式
createTestDbGlobalSetup({
mode: 'pglite',
prefix: 'myapp_test_',
applySchema: async ({ dataDir }) => { /* … */ },
publish: ({ dataDir }) => ({ DB_TYPE: 'pglite', PGLITE_DATA_DIR: dataDir ?? '' }),
});
PGlite 是 Postgres 编译为 Web Assembly, 运行在进程中 . pg_tables, (中文(简体) ),
TRUNCATE … RESTART IDENTITY CASCADE 财务报告和审定财务报表 SET LOCAL lock_timeout 都表现为
在服务器上做,所以同样的测试 运行不变—— 没有多克,在一个
笔记本电脑或者CI 这个软件包自己的重置测试 运行在它上, 这就是论证
在实践中,而不是原则上.
使用它来开发, 不仅仅是测试: “电子数据库”是一个 临时目录,没有服务器可与之相撞.
重设,并证明它发生
import { fromPrisma, makeResetDatabase } from '@app-studio/qa-db';
const resetDatabase = makeResetDatabase(fromPrisma(prisma), { verifyTable: 'User' });
beforeEach(resetDatabase);
两个细节是负载的.
锁出后. TRUNCATE 需要一个进入 ExCLUSIVE锁,和一个真实的
应用在回复后合法地发布火灾和遗忘的文字——a
届会 lastSeenAt一个分析的行。 没有超时,与其中之一比赛
这变成了无休止的等待, 套房挂而不是失败。 失败
快速和重试严格来说更好:同样的比赛以毫秒的速度解决
下一次尝试.
条件. 重置验证自身效果. 开始的套房 相对于所剩行,它不会在这里失败;它会在稍后的三次测试中失败,在某种程度上 读取为应用程序错误。 检查成本一次查询,然后产生混乱 失败成一个明显的.
从数据库中发现表格,而不是公布,以及迁移 簿记独活.
任何客户端
SqlExecutor 是三种方法,所以同样的重置工作 通过Prisma,
pg 或 PGlite 类型 :
import { fromPg, fromPglite, fromPrisma } from '@app-studio/qa-db';
Prisma是经过结构调整而不是进口的—— @prisma/client 实值
依此,每个主机都会被
版本的软件包,在运行生成器之前不存在.
出口
| 导出 | 目的 |
|---|---|
createTestDbGlobalSetup | 恶毒 globalSetup,安装在一个行. |
createEphemeralDatabase, (中文(简体) ), sweepStaleDatabases | 同样的生命周期,绝对, 对于管弦乐剧本. |
makeResetDatabase, (中文(简体) ), tableNames | 带有经核实的后置条件的断接; 发现什么可以断接 . |
fromPrisma, (中文(简体) ), fromPg, (中文(简体) ), fromPglite | 适配器进入 SqlExecutor。 。 。 . |
explicitDatabaseUrl, (中文(简体) ), withDatabase, (中文(简体) ), ephemeralName | 命名和推翻规则,为需要的脚本曝光. |
所需资源
节点.js20或更新. pg 财务报告和审定财务报表 @electric-sql/pglite 是可选的对等方——安装
使用哪种模式 .