@app-studio/qa-种子
种子作为每个地貌单元,按照锁下的依赖顺序组成——加 无依赖的 HTTP 验证器,作为端到端的备战门双倍.
种子是为了什么
该系统不是基础. 一个特定的世界需要,所以它 任何人都可以永远以同样的形态重放. 管理员邀请 已经是会员的人"需要一个工作空间,一个管理员,并且 成员;它的种子就是那个,没有别的了.
这就是种子来的原因 之后 aPI 的决定, 从未有过: 数据写入 在 API 之前,该数据是针对一个猜测写入的.
发现,未申报
// src/features/identity/seed/index.ts
import type { SeedModule } from '@app-studio/qa-seed';
const seed: SeedModule<AppContext> = {
key: 'identity',
async run({ auth }) {
const admin = await auth.signUp({ email: '[email protected]', password: 'password123456' });
return [{ name: 'identity.adminId', value: admin.id }];
},
};
export default seed;
const modules = await discoverSeedModules({ rootDir, pattern: 'src/features/*/seed/index.ts' });
await runSeed({ rootDir, modules, context });
将文件扔入一个特性使其成为种子; 删除特性删除其特性 种子 。 没有中央名单,因为中央名单是 悄悄地出错:一个特性被去掉,其条目被留下,下一个人 读取列表时,可以相信一个已经不存在的特征.
三个不是风格偏好的规则
拨打真正的服务,从来没有SQL. 插入成员中的管理员 表格是一个与接受邀请不同的管理员——否 审计分录,不得有分析事件,不得实时发布. 然后每一次测试 依赖这些副作用是测试一个实际无法应用的世界 生产.
宣布命令;不要假设. 文件顺序不是依赖图,
和一个种子,碰巧工作 因为它的光彩 如何排序它的输入中断
一天,有人重命名一个特性. composeSeeds 地形分类
dependsOn,在有周期时命名周期,并且具有决定性,所以两个运行
(b) 一个登记册产生一个顺序.
过失是破坏的财产. 种子在数据库上运行两次 有人忘记重置 必须产生同一个世界 而不是第二个副本.
锁
runSeed 持有跨进程锁定持续时间。 不慎:取出两个种子
与一个数据库相撞,进入一个它们都无法描述的状态
导致的失败看起来像应用程序错误——一行存在两次, a
代码从未写过的数据上唯一的限制射击.
锁是用取出键键的 所以两个工作树种子 同时两个贝壳 在同一账户中没有。 报告一个臭锁 与持有者的细节 以及清除它的确切命令,绝不自动删除——两个服务员可以 既观察已死持有人,又删除文件,第二个删除 驱逐了第一扇锁 刚刚合法取走.
HTTP 测试
import { expectNonEmpty, verifySeed, waitForSeed } from '@app-studio/qa-seed';
export const checks = [
expectNonEmpty(
'a workspace exists',
'/api/workspaces',
'Every journey signs in and lands in a workspace; with none seeded, they all fail on the first screen.',
),
];
故意超过HTTP而不是超过SQL. 在末端运行 API 时常 拥有与数据库的唯一连接——嵌入式引擎,集合 连接,测试过程无法到达的容器——所以SQL验证器会 或无法连接,或更糟糕的是,连接到 不同 数据库和数据库 愉快地报告成功.
每张支票都带有 proves 线条,报告会打印它。 "预期1,得到
0"派人来看支票 "没有种子,他们都失败了"
第一屏"送来修种子.
同样的功能是准备门. 没有驱动浏览器的
应在通过前开始:针对未种子数据库启动的UI套件
在屏幕中间的某处失败, 并带有空白列表的截图
也没有说数据从未存在过. qa e2e 运行于起始之间
aPI 并启动浏览器将与之交谈的任何内容 .
waitForSeed 同样的检查 与最后期限, 启动窗口。 失败
报告仍然有问题, 不只是那个时间用完了.
出口
| 导出 | 目的 |
|---|---|
SeedModule, (中文(简体) ), composeSeeds | 单位,以及依附的构成. |
discoverSeedModules | 找寻他们. |
runSeed | 在锁下按顺序运行,收集已出版的文物. |
verifySeed, (中文(简体) ), waitForSeed, (中文(简体) ), formatVerifyReport | 证明世界的存在. |
expectNonEmpty, (中文(简体) ), expectJson | 最普通的支票,写出. |
所需资源
节点.js20或更新. 没有超出运行时间的依赖性 @app-studio/qa-core (单位:千美元)
glob —— 特别是修饰者没有依赖性,所以可以跑到任何地方,
包括一个没有其他装置的容器.