en un clic
test-data-management
管理测试数据/fixture 时使用。可复现、隔离、易维护。
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
管理测试数据/fixture 时使用。可复现、隔离、易维护。
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
做 Cocos Creator 多机型/多分辨率适配时使用。Canvas、Widget、安全区。
Cocos Creator 用 AssetBundle 做分包/远程资源时使用。加载、释放、依赖、缓存。
优化 Cocos Creator 渲染性能时使用。合批、图集、动静分离、Label。
给 Cocos Creator 原生包做热更新时使用。version manifest、增量、校验、回滚。
写 Cocos Creator 动效/动画时使用。tween、Animation、Spine、性能与清理。
做 Cocos Creator 大量条目列表时使用。虚拟列表、节点复用。
| name | test-data-management |
| description | 管理测试数据/fixture 时使用。可复现、隔离、易维护。 |
| category | testing |
| tags | ["测试数据","fixture"] |
规则: 构造测试对象时使用工厂函数或 builder,提供合理默认值,测试只覆盖与本用例相关的字段。
为什么: AI 倾向于在每个测试里手写完整对象字面量——{ id: 1, name: "test", email: "a@b.com", role: "admin", createdAt: "...", ... }。当 User 新增一个必填字段时,几十个测试同时编译失败。更危险的是:字段值隐含了业务逻辑(如 role: "admin"),测试其实在测管理员权限,但名字叫"创建用户",后人完全看不出意图。
怎么做:
factory-boy(Python)、fishery(TS)或自定义 makeUser() 函数提供带默认值的工厂。tests/factories/ 统一管理,不散落在每个测试文件里。规则: 每条测试负责自己的数据生命周期:setup 时创建,teardown 时清理,绝不依赖其他测试留下的数据。
为什么: AI 常写出"测试 A 创建记录,测试 B 查询这条记录"的隐式链条。单独跑测试 B 时挂掉,随机改执行顺序后挂掉,并行跑时偶发失败。这种测试脆而难调试,问题一旦出现几乎无法定位。常见事故:一个 beforeAll 里的 seed 数据有 15 个测试依赖它,有人删了其中一条,全组测试随机红了两天才找到原因。
怎么做:
ROLLBACK)隔离每条测试。afterEach 里显式 truncate 或 delete 测试数据。test_ + UUID),便于批量清理。规则: 测试数据完全独立于生产环境构造,包含敏感信息(姓名、手机、身份证号)时一律使用虚假数据。
为什么: AI 有时会建议"从生产库导一份数据做测试 fixture",或者直接在测试里写真实看起来的数据 phone: "13812345678"。前者导致生产数据泄露到测试环境;后者若用了真实用户的手机号,万一测试误发短信则违规。此外生产数据会随业务变化,导致测试时效性问题。
怎么做:
faker / Faker.js 生成逼真但虚假的姓名、手机、邮箱。faker,不用硬编码"张三"、"13800000000"。规则: 只在多个测试真正共享同一不可变前提时才提取全局 fixture;可变数据、用例特有数据不共享。
为什么: AI 生成的测试套件里常有巨大的 conftest.py 或 beforeAll,里面有几十个全局 fixture。这些 fixture 与测试之间形成隐式耦合网:修改一个 fixture 影响范围不明,删一个字段导致无关测试失败。越"方便"的全局 fixture,长期维护成本越高。
怎么做:
it / test 内部或最小作用域的 beforeEach。scope="function" 为默认,按需升级 scope,不反过来。规则: 测试数据的取值和断言的内容要能表达"这个用例在验证什么",不让读者猜。
为什么: AI 生成的测试数据常是完全随意的默认值——price: 100、quantity: 2——但断言 expect(total).toBe(200),读者需要心算才能明白这是在测乘法。更糟的是测试名叫 "should calculate total",但数据里混了折扣逻辑,根本不是在测简单乘法。意图不清晰的测试在失败时无法快速判断是代码 bug 还是测试写错了。
怎么做:
const UNIT_PRICE = 50; // 乘以 2 件 = 100。// 反例 — 每个测试都手写完整 User,新增字段时几十个测试一起挂
it("should send welcome email", async () => {
const user = {
id: 1,
name: "Alice",
email: "alice@example.com",
role: "admin", // ❌ 这个测试根本不关心 role
age: 30, // ❌ 也不关心 age
createdAt: new Date(), // ❌ 也不关心时间
};
await sendWelcomeEmail(user);
expect(mockMailer.sentTo).toBe("alice@example.com");
});
// 正例 — 工厂提供默认值,测试只声明关心的字段
import { makeUser } from "@/tests/factories/user";
it("should send welcome email", async () => {
const user = makeUser({ email: "alice@example.com" }); // ✅ 只覆盖相关字段
await sendWelcomeEmail(user);
expect(mockMailer.sentTo).toBe("alice@example.com");
});
# 反例 — 全局 fixture 里的 order 被 test_A 修改,test_B 读到脏数据
@pytest.fixture(scope="module")
def order(db):
return db.create(Order(status="pending")) # ❌ 模块共享且可变
def test_cancel_order(order, db):
db.update(order.id, status="cancelled") # 改了共享对象
def test_order_is_pending(order, db):
assert order.status == "pending" # ❌ 若上面先跑则断言失败
# 正例 — 函数级 fixture,每 test 独立数据,事务隔离
@pytest.fixture(autouse=True)
def rollback(db):
with db.begin_nested():
yield
db.rollback() # ✅ 每 test 结束自动回滚
def test_cancel_order(db):
order = make_order(db, status="pending") # ✅ 自己创建,不共享
cancel_order(db, order.id)
assert db.get_order(order.id).status == "cancelled"
def test_order_is_pending(db):
order = make_order(db, status="pending") # ✅ 独立数据
assert db.get_order(order.id).status == "pending"