ワンクリックで
test-driven-development
Use when implementing or modifying core SDK paths (event pipeline, storage, network, session management)
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when implementing or modifying core SDK paths (event pipeline, storage, network, session management)
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when a feature, bugfix, or refactoring step is completed and needs review, or before merging to main, or when user says "review", "审查", "帮我看看代码"
Use when receiving an ambiguous feature request, when scope is unclear, or before writing any plan
Use after verification-before-completion passes and code review is clean, to close out the development branch
Use when executing git commit, creating or naming branches, writing PR titles/descriptions, or asking about commit message format, branch naming, or version numbering in this project
Use when writing or reviewing .ets/.ts files in this project, or when seeing any, unknown, obj['key'] index access, destructuring assignment, var declarations,
Use when user asks to create a version release ticket, says "帮我建个发版任务", "建个 Jira", "创建发版单", or needs to track an SDK release in Jira
| name | test-driven-development |
| description | Use when implementing or modifying core SDK paths (event pipeline, storage, network, session management) |
Type: Technique | Discipline: Rigid
在 SDK 核心路径上,先写会失败的测试,再写通过测试的最小实现。测试不是交付后补的文档,而是驱动设计的工具。
核心原则: 测试先行 = 接口先行。如果你想不出怎么测,通常是因为接口设计有问题——这正是 TDD 在设计阶段帮你暴露的问题。
循环节奏: 红 → 绿 → 重构,单次循环 ≤ 10 分钟。循环拉长 = 步子迈大 = 调试噩梦。
EventBuilder / EventPersistence / EventSenderEventTimer)GrowingAnalytics/src/test/
├── core/ # 核心模块测试(Context / DeviceInfo / EventTimer / Network / Session / UserIdentifier / GeneralProps)
├── event/ # 事件相关
├── interfaces/ # 公开 API
├── mobileDebugger/
├── utils/
├── doubles/ # 测试替身(mock/stub)
├── helpers/ # 测试辅助(TestBuilders / JsonParser)
├── List.test.ets # 测试注册入口
└── LocalUnit.test.ets # 模板
新增测试文件:
core/EventSender.test.ets)List.test.ets 中 import 并注册<Module>.test.etsimport { describe, beforeEach, afterEach, it, expect } from '@ohos/hypium'
export default function eventSenderTest() {
describe('EventSender', () => {
beforeEach(() => {
// 每个 case 前重置状态
})
afterEach(() => {
// 清理副作用
})
it('should_batch_at_500_events', 0, () => {
// Red → Green → Refactor
expect(actual).assertEqual(expected)
})
})
}
| 断言 | 用途 |
|---|---|
assertEqual(v) | 严格相等 |
assertTrue() / assertFalse() | 布尔 |
assertNull() / assertUndefined() | 空值 |
assertContain(v) | 子串 / 子集 |
assertThrowError(msg) | 异常 |
assertDeepEquals(v) | 对象深比较 |
本仓库在 src/test/doubles/ 下维护测试替身,src/test/helpers/TestBuilders.ets 提供对象构造器。
TestBuilders 构造 Event / Config 等对象,避免每个测试重复长构造beforeEach 中重置 AnalyticsCore / GrowingContext 的状态# 在 DevEco Studio 中运行 GrowingAnalyticsTest(.run/GrowingAnalyticsTest.run.xml 已配置)
# 或命令行:
hvigorw test --mode module -p module=GrowingAnalytics@default -p product=default
核心路径变更后,在 Step 5: 验证 阶段必须跑一遍测试,见 engineer persona。
事件从 track() 调用到入库是异步链路(TaskPool)。测试时:
setTimeout 轮询UIAbility.onForeground / onBackground 无法在 hypium 单测中真实触发——通过封装一层 LifecycleObserver 接口,测试时直接调用观察者方法。
事件有 Protobuf(NewSaaS/CDP)和 JSON(SaaS)两种序列化路径,必须分别测:
it('protobuf_path_includes_eventSequenceId', ...)
it('json_path_includes_eventSequenceId', ...)
compressEnabled × encryptEnabled 共 4 种组合,核心路径至少覆盖:
任何采集路径都必须有"关闭总开关后不采集"的测试,验证隐私合规红线。
| 坏味道 | 为什么坏 |
|---|---|
| 先写实现再补测试 | 测试退化为"验证代码写了什么"而不是"验证行为正确" |
| 测试跑起来要 > 1 秒 | 慢测试 = 不跑 = 退化为摆设 |
一个 it 里 10 个 assert | 失败时不知道哪个断言挂了 |
| 测试依赖真实网络 / 真实文件系统 | 脆弱、慢、环境相关 |
it.skip 长期存在 | 要么修,要么删 |
| Excuse | Reality |
|---|---|
| "先写实现再补测试" | 测试退化为"验证代码写了什么",失去发现设计错误的能力 |
| "测试让它过就行,断言改宽松点" | 等于没测——下次回归改动就会悄悄破坏行为 |
| "这块改动太简单不用测试" | 简单代码的 bug 最羞耻;核心路径零例外 |
| "测试加了但没跑失败过" | 没见过 Red 的 Green 不算 Green,可能测的是空实现 |
| "单测跑真实网络/RDB 才真实" | 依赖外部 = 慢 + 脆弱 = 最后没人跑 |
| "一个 it 里多几个 assert 省事" | 失败时定位困难;拆成多个 it |
| "dataCollectionEnabled=false 的路径不用测" | 这是隐私合规红线,必须有"关了就不采集"的测试 |
writing-plans 在"影响面自查清单"中判定本次涉及核心模块verification-before-completion 做最终验证systematic-debugging 的四阶段先于 TDD