Manus에서 모든 스킬 실행
원클릭으로
원클릭으로
원클릭으로 Manus에서 모든 스킬 실행
시작하기$pwd:
$ git log --oneline --stat
stars:254
forks:163
updated:2026년 4월 18일 07:48
SKILL.md
| name | Test-Driven Development |
| description | Write tests before code using RED-GREEN-REFACTOR cycle |
TDD transforms testing from an afterthought into the foundation of development. Tests are proof that code works correctly.
Write a test that describes expected behavior. It must fail.
describe('calculateDiscount', () => {
it('should apply 10% discount for orders over $100', () => {
const result = calculateDiscount(150);
expect(result).toBe(15);
});
});
Run: npm test → Should FAIL
Write minimal code to pass the test. No extras.
function calculateDiscount(amount) {
if (amount > 100) return amount * 0.1;
return 0;
}
Run: npm test → Should PASS
Improve code while keeping tests green.
const DISCOUNT_THRESHOLD = 100;
const DISCOUNT_RATE = 0.1;
function calculateDiscount(amount) {
if (amount <= DISCOUNT_THRESHOLD) return 0;
return amount * DISCOUNT_RATE;
}
Run: npm test → Should still PASS
it('should handle empty cart without error (bug #456)', () => {
const cart = new Cart([]);
expect(() => cart.getTotal()).not.toThrow();
expect(cart.getTotal()).toBe(0);
});
Run test → Confirms bug exists
getTotal() {
if (this.items.length === 0) return 0; // Fix
return this.items.reduce((sum, item) => sum + item.price, 0);
}
Run test → Confirms fix works
npm test # No regressions
┌─────────┐
│ E2E │ 5% — Critical user flows
│ Tests │ Full system, minutes
├─────────┤
│ Integr. │ 15% — API + DB interactions
│ Tests │ Seconds
├─────────┤
│ Unit │ 80% — Pure logic
│ Tests │ Milliseconds
└─────────┘
it('should calculate tax for California', () => {
// Arrange — Setup
const order = createOrder({ state: 'CA', subtotal: 100 });
// Act — Execute
const tax = calculateTax(order);
// Assert — Verify
expect(tax).toBe(7.25);
});
Tests should be Descriptive And Meaningful Phrases.
// ✅ DAMP — Self-contained and clear
it('should reject password without uppercase letter', () => {
const result = validatePassword('lowercase123!');
expect(result.valid).toBe(false);
expect(result.errors).toContain('Must contain uppercase letter');
});
// ❌ Too DRY — Requires reading shared context
it('should reject invalid password', () => {
expect(validate(INVALID_PASSWORD_NO_UPPER)).toBe(false);
});
// ✅ Prefer: Real or fake
const db = createTestDatabase();
const user = await userService.create(db, userData);
// ⚠️ Use sparingly: Mocks
const mockDb = { create: vi.fn().mockResolvedValue(user) };
// Pattern: should [expected behavior] when [condition]
// ✅ Good
'should return empty array when no users exist'
'should throw ValidationError when email is invalid'
'should send welcome email after registration'
// ❌ Bad
'works correctly'
'test user creation'
'handles error'
| Pattern | Problem | Solution |
|---|---|---|
| Testing internals | Breaks on refactor | Test behavior, not implementation |
| Flaky tests | Erodes trust | Use deterministic data |
| Over-mocking | False confidence | Prefer real implementations |
| Snapshot abuse | Large diffs ignored | Use sparingly |
| Shared mutable state | Tests affect each other | Reset in beforeEach |
| Testing frameworks | Wasted effort | Only test your code |
Five-axis code review for comprehensive quality assessment
Build features in thin vertical slices with continuous verification
Skill to automate the full deployment process including build, test, and release steps
Skill to perform a thorough security audit of the codebase