tdd
1
总安装量
1
周安装量
#48420
全站排名
安装命令
npx skills add https://github.com/kimny1143/claude-code-template --skill tdd
Agent 安装分布
mcpjam
1
claude-code
1
replit
1
junie
1
windsurf
1
zencoder
1
Skill 文档
/tdd – Test-Driven Development
ãã¹ãé§åéçºã¯ã¼ã¯ããã¼ãå®è¡ããã
ä½¿ãæ¹
/tdd # 対話çã«TDDãéå§
/tdd UserService # UserServiceã®ãã¹ãããéå§
/tdd handlePayment edge # handlePaymentã®ã¨ãã¸ã±ã¼ã¹ãã¹ã
TDDãµã¤ã¯ã«
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â 1. RED â ãã¹ããæ¸ãï¼å¤±æãããã¨ã確èªï¼ â
â 2. GREEN â æå°éã®ã³ã¼ãã§éã â
â 3. REFACTOR â ãªãã¡ã¯ã¿ï¼ãã¹ãã¯éã£ãã¾ã¾ï¼â
âââââââââââââââââââââââââââââââââââââââââââââââââââ
ã¯ã¼ã¯ããã¼
Step 1: REDï¼ãã¹ããæ¸ãï¼
-
ãã¹ã対象ãç¹å®
- æ°æ©è½: æå¾ ããå ¥åºåãå®ç¾©
- ãã°ä¿®æ£: ãã°ãåç¾ãããã¹ããæ¸ã
-
ãã¹ããã¡ã¤ã«ã使/æ´æ°
// tests/unit/services/user.service.test.ts describe('UserService', () => { describe('createUser', () => { it('should create user with valid data', async () => { const result = await userService.createUser({ email: 'test@example.com', name: 'Test User', }); expect(result.id).toBeDefined(); expect(result.email).toBe('test@example.com'); }); it('should throw error for duplicate email', async () => { // ã¨ãã¸ã±ã¼ã¹ await expect( userService.createUser({ email: 'existing@example.com', name: 'Test' }) ).rejects.toThrow('Email already exists'); }); }); }); -
ãã¹ãå®è¡ â 失æã確èª
npm run test -- --watch tests/unit/services/user.service.test.ts
Step 2: GREENï¼å®è£ ããï¼
-
æå°éã®å®è£ ã§éã
- å®ç§ãç®æããªã
- ãã¼ãã³ã¼ãã§ãOKï¼å¾ã§ãªãã¡ã¯ã¿ï¼
- ãã¹ããéããã¨ã ãã«éä¸
-
ãã¹ãå®è¡ â æåã確èª
Step 3: REFACTORï¼æ¹åããï¼
-
ãã¹ããéã£ãç¶æ ã§:
- éè¤ãæé¤
- å½åãæ¹å
- æ§é ãæ´ç
-
ãã¹ãå®è¡ â ã¾ã éããã¨ã確èª
-
æºè¶³ãããæ¬¡ã®ãã¹ãã¸ï¼Step 1ã«æ»ãï¼
ãã¹ãã®æ¸ãæ¹ã¬ã¤ã
å½åè¦å
describe('[対象]', () => {
describe('[ã¡ã½ãã/æ©è½]', () => {
it('should [æå¾
ããåä½] when [æ¡ä»¶]', () => {
// ...
});
});
});
ã«ãã¼ãã¹ãã±ã¼ã¹
| ã±ã¼ã¹ | ä¾ |
|---|---|
| æ£å¸¸ç³» | æå¹ãªå ¥åã§æå¾ éãåä½ |
| å¢çå¤ | 0, 空æå, é åã®æå/æå¾ |
| ã¨ã©ã¼ç³» | ç¡å¹ãªå ¥åãnull/undefined |
| ã¨ãã¸ã±ã¼ã¹ | 並è¡ã¢ã¯ã»ã¹ãã¿ã¤ã ã¢ã¦ã |
ã¢ãã¯ã®ä½¿ãæ¹
// å¤é¨ä¾åã¯ã¢ãã¯
vi.mock('@/db', () => ({
db: {
select: vi.fn().mockReturnValue({
from: vi.fn().mockReturnValue({
where: vi.fn().mockResolvedValue([{ id: '1', name: 'Test' }]),
}),
}),
},
}));
ãã¹ãã³ãã³ãä¾
Vitest
npm run test # å
¨ãã¹ã
npm run test -- --watch # ã¦ã©ããã¢ã¼ã
npm run test -- tests/unit/specific # ç¹å®ãã£ã¬ã¯ããª
npm run test -- --coverage # ã«ãã¬ãã¸
Jest
npm test # å
¨ãã¹ã
npm test -- --watch # ã¦ã©ããã¢ã¼ã
npm test -- --coverage # ã«ãã¬ãã¸
Playwright (E2E)
npm run test:e2e # å
¨E2E
npx playwright test --grep "login" # ç¹å®ãã¹ã
ãã§ãã¯ãªã¹ã
TDDå®äºæã®ç¢ºèª:
- ãã¹ããå ã«æ¸ãããï¼å®è£ ããåï¼
- ãã¹ããä¸åº¦å¤±æããï¼REDãã§ã¼ãºï¼
- æå°éã®å®è£ ã§éããï¼GREENï¼
- ãªãã¡ã¯ã¿å¾ããã¹ããéã
- ã¨ãã¸ã±ã¼ã¹ãã«ãã¼ããã¦ãã
- ãã¹ãåãåä½ã説æãã¦ãã