본문으로 건너뛰기
cccskills
무료GitHub에 공개

developing-with-tdd

Test-Driven Development for backend code. Red-Green-Refactor cycle with practical patterns.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md2.6 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

TDD Cycle

Red → Green → Refactor

  1. Red: Write a failing test that describes desired behavior
  2. Green: Write the minimum code to make it pass (no gold-plating)
  3. Refactor: Improve the code without changing behavior (tests stay green)

Never skip to Green without a failing Red test first.

Practical Rules

Rule 1: One test at a time Write one failing test. Make it pass. Only then write the next test.

Rule 2: Minimum viable production code In Green phase, write only what's needed to pass the test. No future-proofing.

Rule 3: Test behavior, not implementation Bad: expect(user._hash).toBeDefined() Good: expect(await user.verifyPassword('secret')).toBe(true)

Rule 4: Fast tests Unit tests must run in <100ms. Use mocks for I/O (database, network, filesystem).

Structure

src/
  auth/
    auth.service.ts         ← Implementation
    auth.service.test.ts    ← Tests (co-located)

Test Template (TypeScript/Vitest)

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { AuthService } from './auth.service';

describe('AuthService', () => {
  let service: AuthService;

  beforeEach(() => {
    service = new AuthService({ /* mock deps */ });
  });

  describe('login()', () => {
    it('returns a JWT token for valid credentials', async () => {
      // Arrange
      const credentials = { email: 'user@test.com', password: 'correct' };
      // Act
      const result = await service.login(credentials);
      // Assert
      expect(result.token).toMatch(/^eyJ/);
    });

    it('throws for invalid password', async () => {
      await expect(service.login({ email: 'user@test.com', password: 'wrong' }))
        .rejects.toThrow('Invalid credentials');
    });
  });
});

Mocking External Dependencies

// Mock the database
const mockUserRepo = {
  findByEmail: vi.fn().mockResolvedValue({ id: '1', email: 'user@test.com', passwordHash: '$2b...' }),
};

When to Stop TDD

  • Configuration files
  • Simple data transformations (use property-based testing instead)
  • Exploratory code (spike) — delete tests after learning, rewrite properly

Definition of Done

  • All tests pass
  • No test mocks real behavior (only I/O)
  • Coverage ≥ 80% on the changed module
  • Tests run in < 1 second total

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

anoa

무료

Drive a real browser from the command line — open pages, snapshot the interactive elements as refs, click and fill by ref, read text, run JS, screenshot. Use when a task needs a live browser: checking a page renders, walking a login or checkout flow, scraping something that only exists after JavaScript runs, or reproducing a UI bug.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

Run linters/typecheckers to calculate health score.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

Comprehensive UI/UX compliance check (A11y, performance, responsive).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

Infrastructure-first security audit (OWASP, secrets, dependencies).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

auth

무료

Setup authentication flow (register, login, session/JWT, middleware)

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

Deep knowledge about deploying applications to AWS (EC2, ECS, S3, CloudFront, Cloud Run).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

porcupine-md/jonggrang162026년 9월 15일 업데이트

porcupine-md의 스킬 모두 보기

이 스킬의 문제 신고