@sk8metal/michi-cli 0.10.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -848
- package/dist/scripts/constants/environments.d.ts +1 -1
- package/dist/scripts/constants/environments.d.ts.map +1 -1
- package/dist/scripts/constants/environments.js +0 -20
- package/dist/scripts/constants/environments.js.map +1 -1
- package/dist/scripts/phase-runner.js +1 -1
- package/dist/scripts/phase-runner.js.map +1 -1
- package/dist/scripts/utils/multi-repo-validator.d.ts +18 -0
- package/dist/scripts/utils/multi-repo-validator.d.ts.map +1 -1
- package/dist/scripts/utils/multi-repo-validator.js +42 -0
- package/dist/scripts/utils/multi-repo-validator.js.map +1 -1
- package/dist/scripts/utils/tasks-format-validator.js +3 -3
- package/dist/scripts/utils/tasks-format-validator.js.map +1 -1
- package/dist/scripts/utils/template-finder.d.ts +2 -2
- package/dist/scripts/utils/template-finder.d.ts.map +1 -1
- package/dist/scripts/utils/template-finder.js +3 -8
- package/dist/scripts/utils/template-finder.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +0 -8
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts +0 -4
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +6 -30
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +2 -6
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +8 -142
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/docs/README.md +20 -83
- package/docs/getting-started/configuration.md +350 -0
- package/docs/getting-started/installation.md +59 -0
- package/docs/getting-started/quick-start.md +76 -0
- package/docs/guides/atlassian-integration.md +116 -0
- package/docs/guides/claude-code.md +155 -0
- package/docs/guides/multi-repo.md +117 -0
- package/docs/guides/workflow.md +382 -0
- package/docs/reference/ai-commands.md +92 -0
- package/docs/reference/cli.md +752 -0
- package/docs/reference/environment-variables.md +192 -0
- package/docs/troubleshooting.md +498 -0
- package/package.json +1 -3
- package/scripts/__tests__/create-project.test.ts +12 -12
- package/scripts/__tests__/setup-existing-project.test.ts +22 -22
- package/scripts/constants/__tests__/environments.test.ts +7 -50
- package/scripts/constants/environments.ts +1 -27
- package/scripts/phase-runner.ts +1 -1
- package/scripts/template/__tests__/renderer.test.ts +21 -21
- package/scripts/utils/__tests__/multi-repo-validator.test.ts +159 -1
- package/scripts/utils/multi-repo-validator.ts +50 -0
- package/scripts/utils/tasks-format-validator.ts +3 -3
- package/scripts/utils/template-finder.ts +5 -11
- package/templates/claude/agents/e2e-first-planner/AGENT.md +1 -1
- package/templates/claude/agents/pr-resolver/AGENT.md +15 -3
- package/templates/claude/commands/michi/e2e-plan.md +1 -1
- package/templates/claude/commands/michi/spec-design.md +2 -2
- package/templates/claude/commands/michi/spec-tasks.md +156 -0
- package/templates/claude/commands/michi/test-planning.md +1 -1
- package/templates/claude/commands/michi/validate-design.md +3 -3
- package/templates/claude/commands/michi-multi-repo/impl-all.md +30 -1
- package/templates/claude/commands/michi-multi-repo/propagate-specs.md +14 -1
- package/templates/claude/commands/michi-multi-repo/spec-review.md +16 -2
- package/templates/claude-agent/agents/repo-spec-executor.md +1 -1
- package/templates/claude-agent/commands/michi/spec-tasks.md +117 -0
- package/templates/claude-agent/rules/code-size-monitor.md +26 -0
- package/templates/claude-agent/rules/code-size-rules.md +32 -0
- package/templates/michi/cc-sdd-overrides/settings/rules/design-review-michi.md +1 -1
- package/docs/context.md +0 -59
- package/docs/michi-development/contributing/development.md +0 -341
- package/docs/michi-development/contributing/release.md +0 -365
- package/docs/michi-development/design/config-unification.md +0 -733
- package/docs/michi-development/design/design-config-current-state.md +0 -330
- package/docs/michi-development/design/design-config-implementation.md +0 -628
- package/docs/michi-development/design/design-config-migration.md +0 -952
- package/docs/michi-development/design/design-config-security.md +0 -771
- package/docs/michi-development/design/design-config-solution.md +0 -583
- package/docs/michi-development/design/design-config-testing.md +0 -892
- package/docs/michi-development/testing/manual-verification-flow.md +0 -871
- package/docs/michi-development/testing/manual-verification-other-tools.md +0 -1279
- package/docs/michi-development/testing/manual-verification-troubleshooting.md +0 -122
- package/docs/michi-development/testing/pre-publish-checklist.md +0 -560
- package/docs/michi-development/testing-strategy.md +0 -87
- package/docs/plan.md +0 -275
- package/docs/user-guide/getting-started/github-token-setup.md +0 -510
- package/docs/user-guide/getting-started/new-repository-setup.md +0 -704
- package/docs/user-guide/getting-started/quick-start.md +0 -212
- package/docs/user-guide/getting-started/setup.md +0 -819
- package/docs/user-guide/guides/agent-skills-integration.md +0 -222
- package/docs/user-guide/guides/customization.md +0 -537
- package/docs/user-guide/guides/internationalization.md +0 -540
- package/docs/user-guide/guides/migration-guide.md +0 -138
- package/docs/user-guide/guides/multi-project.md +0 -368
- package/docs/user-guide/guides/multi-repo-guide.md +0 -1590
- package/docs/user-guide/guides/phase-automation.md +0 -419
- package/docs/user-guide/guides/workflow.md +0 -574
- package/docs/user-guide/hands-on/README.md +0 -142
- package/docs/user-guide/hands-on/claude-agent-setup.md +0 -597
- package/docs/user-guide/hands-on/claude-setup.md +0 -452
- package/docs/user-guide/hands-on/cursor-setup.md +0 -353
- package/docs/user-guide/hands-on/troubleshooting.md +0 -964
- package/docs/user-guide/hands-on/verification-checklist.md +0 -439
- package/docs/user-guide/hands-on/workflow-walkthrough.md +0 -1078
- package/docs/user-guide/reference/config.md +0 -589
- package/docs/user-guide/reference/multi-repo-api.md +0 -771
- package/docs/user-guide/reference/quick-reference.md +0 -297
- package/docs/user-guide/reference/security-test-payloads.md +0 -50
- package/docs/user-guide/reference/tasks-template.md +0 -550
- package/docs/user-guide/release/ci-setup-java.md +0 -114
- package/docs/user-guide/release/ci-setup-nodejs.md +0 -94
- package/docs/user-guide/release/ci-setup-php.md +0 -102
- package/docs/user-guide/release/ci-setup-troubleshooting.md +0 -94
- package/docs/user-guide/release/ci-setup.md +0 -188
- package/docs/user-guide/release/release-flow.md +0 -476
- package/docs/user-guide/templates/test-specs/README.md +0 -173
- package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +0 -553
- package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +0 -435
- package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +0 -454
- package/docs/user-guide/templates/test-specs/security-test-spec-template.md +0 -625
- package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +0 -328
- package/docs/user-guide/testing/integration-tests.md +0 -312
- package/docs/user-guide/testing/tdd-cycle.md +0 -349
- package/docs/user-guide/testing/test-execution-flow.md +0 -396
- package/docs/user-guide/testing/test-failure-handling.md +0 -521
- package/docs/user-guide/testing/test-planning-flow.md +0 -185
- package/docs/user-guide/testing-strategy.md +0 -185
- package/docs/verification-guide.md +0 -518
- package/templates/cline/rules/atlassian-integration.md +0 -36
- package/templates/cline/rules/michi-core.md +0 -56
- package/templates/codex/AGENTS.override.md +0 -277
- package/templates/codex/prompts/confluence-sync.md +0 -177
- package/templates/codex/rules/README.md +0 -210
- package/templates/cursor/commands/kiro/kiro-spec-impl.md +0 -244
- package/templates/cursor/commands/kiro/kiro-spec-tasks.md +0 -354
- package/templates/cursor/commands/michi/confluence-sync.md +0 -76
- package/templates/cursor/commands/michi/project-switch.md +0 -69
- package/templates/cursor/rules/atlassian-mcp.mdc +0 -188
- package/templates/cursor/rules/github-ssot.mdc +0 -151
- package/templates/cursor/rules/multi-project.mdc +0 -81
- package/templates/gemini/commands/README.md +0 -41
- package/templates/gemini/rules/GEMINI.md +0 -80
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
# TDDサイクル
|
|
2
|
-
|
|
3
|
-
このドキュメントでは、michiを使用したプロジェクトでのテスト駆動開発(TDD)サイクルについて説明します。
|
|
4
|
-
|
|
5
|
-
## michiワークフローにおけるTDDの位置づけ
|
|
6
|
-
|
|
7
|
-
TDDは **Phase 2: TDD実装** フェーズで実践します。Phase 0.4で作成したテスト仕様書に基づき、テストコードと実装コードを同時進行で作成します。
|
|
8
|
-
|
|
9
|
-
詳細なワークフローは [ワークフローガイド](../guides/workflow.md#phase-2-tdd実装) を参照してください。
|
|
10
|
-
|
|
11
|
-
## TDDとは
|
|
12
|
-
|
|
13
|
-
**テスト駆動開発(Test-Driven Development, TDD)** は、コードを書く前にテストを書く開発手法です。テストファーストの考え方により、以下のメリットが得られます:
|
|
14
|
-
|
|
15
|
-
- **設計の改善**: テストを先に書くことで、使いやすいインターフェースを設計できる
|
|
16
|
-
- **バグの早期発見**: 実装直後にテストで検証するため、バグを早く見つけられる
|
|
17
|
-
- **リファクタリングの安心感**: テストがあることで、コード改善時の品質が保証される
|
|
18
|
-
- **ドキュメントとしての役割**: テストコードが仕様書の役割を果たす
|
|
19
|
-
|
|
20
|
-
## RED-GREEN-REFACTORサイクル
|
|
21
|
-
|
|
22
|
-
TDDは以下の3ステップを繰り返します:
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
RED → GREEN → REFACTOR → RED → GREEN → REFACTOR → ...
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 1. RED: 失敗するテストを書く
|
|
29
|
-
|
|
30
|
-
まず、**実装が存在しない状態で**テストを書きます。このテストは必ず失敗します(RED)。
|
|
31
|
-
|
|
32
|
-
#### 例(Node.js/Vitest)
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
// tests/unit/calculator.test.ts
|
|
36
|
-
import { describe, it, expect } from 'vitest';
|
|
37
|
-
import { calculateTotal } from '../src/calculator';
|
|
38
|
-
|
|
39
|
-
describe('calculateTotal', () => {
|
|
40
|
-
it('should return sum of array elements', () => {
|
|
41
|
-
const result = calculateTotal([10, 20, 30]);
|
|
42
|
-
expect(result).toBe(60); // このテストは失敗する(関数がまだ存在しない)
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**実行結果**:
|
|
48
|
-
```
|
|
49
|
-
❌ FAIL tests/unit/calculator.test.ts
|
|
50
|
-
calculateTotal
|
|
51
|
-
✗ should return sum of array elements
|
|
52
|
-
Module not found: Cannot find module '../src/calculator'
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**重要**: この段階でテストが失敗することを確認してください。もしテストが成功する場合、テストが正しく機能していない可能性があります。
|
|
56
|
-
|
|
57
|
-
### 2. GREEN: 最小限の実装でテストを通す
|
|
58
|
-
|
|
59
|
-
次に、テストを通すための**最小限の実装**を書きます。この段階では、コードの美しさやパフォーマンスは気にしません。
|
|
60
|
-
|
|
61
|
-
#### 例
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
// src/calculator.ts
|
|
65
|
-
export function calculateTotal(numbers: number[]): number {
|
|
66
|
-
let sum = 0;
|
|
67
|
-
for (const num of numbers) {
|
|
68
|
-
sum += num;
|
|
69
|
-
}
|
|
70
|
-
return sum;
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**実行結果**:
|
|
75
|
-
```
|
|
76
|
-
✅ PASS tests/unit/calculator.test.ts
|
|
77
|
-
calculateTotal
|
|
78
|
-
✓ should return sum of array elements (2ms)
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**重要**: テストが成功したら、すぐに次のステップに進みます。
|
|
82
|
-
|
|
83
|
-
### 3. REFACTOR: コードを改善する
|
|
84
|
-
|
|
85
|
-
テストが通った状態で、コードを**リファクタリング**します。この段階で、コードの重複を排除したり、可読性を向上させたりします。
|
|
86
|
-
|
|
87
|
-
#### 例
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
// src/calculator.ts (リファクタリング後)
|
|
91
|
-
export function calculateTotal(numbers: number[]): number {
|
|
92
|
-
return numbers.reduce((sum, num) => sum + num, 0);
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**実行結果**:
|
|
97
|
-
```
|
|
98
|
-
✅ PASS tests/unit/calculator.test.ts
|
|
99
|
-
calculateTotal
|
|
100
|
-
✓ should return sum of array elements (2ms)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**重要**: リファクタリング後も、すべてのテストが成功することを確認してください。
|
|
104
|
-
|
|
105
|
-
### サイクルの繰り返し
|
|
106
|
-
|
|
107
|
-
上記の3ステップを繰り返して、機能を少しずつ追加していきます。
|
|
108
|
-
|
|
109
|
-
#### 次のテストケース(RED)
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
it('should return 0 for empty array', () => {
|
|
113
|
-
const result = calculateTotal([]);
|
|
114
|
-
expect(result).toBe(0); // 既存の実装でも成功するが、明示的にテスト
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should throw error for non-numeric values', () => {
|
|
118
|
-
expect(() => calculateTotal([10, 'invalid', 30])).toThrow(TypeError); // 失敗
|
|
119
|
-
});
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
#### 実装の追加(GREEN)
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
export function calculateTotal(numbers: number[]): number {
|
|
126
|
-
// 型チェックを追加
|
|
127
|
-
if (!numbers.every(num => typeof num === 'number')) {
|
|
128
|
-
throw new TypeError('All elements must be numbers');
|
|
129
|
-
}
|
|
130
|
-
return numbers.reduce((sum, num) => sum + num, 0);
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
## 最も重要な原則: テストは仕様
|
|
135
|
-
|
|
136
|
-
TDDで最も重要な原則は、**テストは仕様を表す**ということです。
|
|
137
|
-
|
|
138
|
-
### ❌ 絶対にやってはいけないこと
|
|
139
|
-
|
|
140
|
-
**実装に合わせてテストを修正する**
|
|
141
|
-
|
|
142
|
-
```typescript
|
|
143
|
-
// 悪い例
|
|
144
|
-
it('should return sum of array elements', () => {
|
|
145
|
-
const result = calculateTotal([10, 20, 30]);
|
|
146
|
-
expect(result).toBe(70); // ❌ 実装が70を返すからテストを変更
|
|
147
|
-
});
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
**理由**: これでは、テストが仕様ではなく、実装を追認しているだけになります。バグがあっても見逃してしまいます。
|
|
151
|
-
|
|
152
|
-
### ✅ 正しいアプローチ
|
|
153
|
-
|
|
154
|
-
**仕様が変更された場合のみテストを修正する**
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
// 良い例
|
|
158
|
-
// 仕様変更: 「合計に消費税10%を加算する」
|
|
159
|
-
it('should return sum with 10% tax', () => {
|
|
160
|
-
const result = calculateTotalWithTax([10, 20, 30]);
|
|
161
|
-
expect(result).toBe(66); // ✅ 60 + (60 * 0.1) = 66
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### 判断フローチャート
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
テストが失敗した
|
|
169
|
-
↓
|
|
170
|
-
なぜ失敗したのか?
|
|
171
|
-
↓
|
|
172
|
-
├─ 仕様が変更された
|
|
173
|
-
│ → ✅ テストを修正する
|
|
174
|
-
│
|
|
175
|
-
├─ 実装にバグがある
|
|
176
|
-
│ → ✅ 実装を修正する
|
|
177
|
-
│
|
|
178
|
-
└─ テストが間違っている
|
|
179
|
-
→ ✅ テストを修正する
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
**注意**: 「実装がこうなっているから」という理由でテストを変更してはいけません。
|
|
183
|
-
|
|
184
|
-
## TDDのベストプラクティス
|
|
185
|
-
|
|
186
|
-
### 1. 小さなステップで進む
|
|
187
|
-
|
|
188
|
-
一度に大きな機能を実装しようとせず、小さな単位で RED → GREEN → REFACTOR を繰り返します。
|
|
189
|
-
|
|
190
|
-
**悪い例**:
|
|
191
|
-
```typescript
|
|
192
|
-
// 一度に複数の機能をテスト
|
|
193
|
-
it('should calculate, filter, and format', () => {
|
|
194
|
-
// 複雑なテスト...
|
|
195
|
-
});
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
**良い例**:
|
|
199
|
-
```typescript
|
|
200
|
-
it('should calculate total', () => { /* ... */ });
|
|
201
|
-
it('should filter negative numbers', () => { /* ... */ });
|
|
202
|
-
it('should format as currency', () => { /* ... */ });
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### 2. テストが失敗することを確認する
|
|
206
|
-
|
|
207
|
-
新しいテストを書いたら、必ず一度は失敗することを確認します。
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
# テストを書く
|
|
211
|
-
# ↓
|
|
212
|
-
npm test # 失敗することを確認
|
|
213
|
-
# ↓
|
|
214
|
-
# 実装を書く
|
|
215
|
-
# ↓
|
|
216
|
-
npm test # 成功することを確認
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### 3. 1つのテストで1つのことを検証する
|
|
220
|
-
|
|
221
|
-
テストは小さく、焦点を絞って書きます。
|
|
222
|
-
|
|
223
|
-
**悪い例**:
|
|
224
|
-
```typescript
|
|
225
|
-
it('should work correctly', () => {
|
|
226
|
-
expect(calculateTotal([10, 20])).toBe(30);
|
|
227
|
-
expect(calculateTotal([])).toBe(0);
|
|
228
|
-
expect(() => calculateTotal([10, 'x'])).toThrow();
|
|
229
|
-
});
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**良い例**:
|
|
233
|
-
```typescript
|
|
234
|
-
it('should return sum of array elements', () => {
|
|
235
|
-
expect(calculateTotal([10, 20])).toBe(30);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('should return 0 for empty array', () => {
|
|
239
|
-
expect(calculateTotal([])).toBe(0);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('should throw error for invalid input', () => {
|
|
243
|
-
expect(() => calculateTotal([10, 'x'])).toThrow();
|
|
244
|
-
});
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### 4. テストコードも保守する
|
|
248
|
-
|
|
249
|
-
テストコードもプロダクションコードと同じように、リファクタリングして保守します。
|
|
250
|
-
|
|
251
|
-
```typescript
|
|
252
|
-
// 共通のヘルパー関数を使う
|
|
253
|
-
function createTestData() {
|
|
254
|
-
return [10, 20, 30];
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
it('should calculate total', () => {
|
|
258
|
-
const data = createTestData();
|
|
259
|
-
expect(calculateTotal(data)).toBe(60);
|
|
260
|
-
});
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## 言語別のTDD例
|
|
264
|
-
|
|
265
|
-
### Node.js/TypeScript (Vitest)
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
// RED
|
|
269
|
-
import { describe, it, expect } from 'vitest';
|
|
270
|
-
import { User } from '../src/user';
|
|
271
|
-
|
|
272
|
-
describe('User', () => {
|
|
273
|
-
it('should create user with name', () => {
|
|
274
|
-
const user = new User('Alice');
|
|
275
|
-
expect(user.getName()).toBe('Alice');
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// GREEN
|
|
280
|
-
export class User {
|
|
281
|
-
constructor(private name: string) {}
|
|
282
|
-
getName() { return this.name; }
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// REFACTOR(リファクタリングの余地がない場合はスキップ)
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
### Java (JUnit 5 + Gradle)
|
|
289
|
-
|
|
290
|
-
```java
|
|
291
|
-
// RED
|
|
292
|
-
import org.junit.jupiter.api.Test;
|
|
293
|
-
import static org.junit.jupiter.api.Assertions.*;
|
|
294
|
-
|
|
295
|
-
class UserTest {
|
|
296
|
-
@Test
|
|
297
|
-
void shouldCreateUserWithName() {
|
|
298
|
-
User user = new User("Alice");
|
|
299
|
-
assertEquals("Alice", user.getName());
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// GREEN
|
|
304
|
-
public class User {
|
|
305
|
-
private String name;
|
|
306
|
-
public User(String name) { this.name = name; }
|
|
307
|
-
public String getName() { return name; }
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
### PHP (PHPUnit)
|
|
312
|
-
|
|
313
|
-
```php
|
|
314
|
-
// RED
|
|
315
|
-
<?php
|
|
316
|
-
use PHPUnit\Framework\TestCase;
|
|
317
|
-
|
|
318
|
-
class UserTest extends TestCase
|
|
319
|
-
{
|
|
320
|
-
public function testShouldCreateUserWithName()
|
|
321
|
-
{
|
|
322
|
-
$user = new User('Alice');
|
|
323
|
-
$this->assertEquals('Alice', $user->getName());
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// GREEN
|
|
328
|
-
class User
|
|
329
|
-
{
|
|
330
|
-
private $name;
|
|
331
|
-
public function __construct($name) { $this->name = $name; }
|
|
332
|
-
public function getName() { return $this->name; }
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
## まとめ
|
|
337
|
-
|
|
338
|
-
TDDの核心は以下の3つです:
|
|
339
|
-
|
|
340
|
-
1. **RED-GREEN-REFACTORサイクル**を繰り返す
|
|
341
|
-
2. **テストは仕様**であり、実装に合わせて変更してはいけない
|
|
342
|
-
3. **小さなステップ**で進む
|
|
343
|
-
|
|
344
|
-
TDDを実践することで、品質の高いコードを効率的に書けるようになります。
|
|
345
|
-
|
|
346
|
-
## 次のステップ
|
|
347
|
-
|
|
348
|
-
- [テスト実行フロー](./test-execution-flow.md): Phase A/Bでのテスト実行
|
|
349
|
-
- [テスト失敗時の対応](./test-failure-handling.md): テスト失敗時の対処方法
|