C.W.K.
Stream
Lesson 01 of 03 · published

왜 테스트해? (종교적 답 말고)

~15 min · foundations, philosophy, aaa

Level 0테스트 호기심
0 XP0/32 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"테스트는 숨 참지 않고 코드를 바꾸기 위해 존재해."

종교적 답 (건너뛰어)

"왜 테스트해?" 에 대한 종교적 답은 보통 이래: "테스트는 정확성을 증명해," "TDD 만이 유일한 길이야," "Coverage 100% 가 곧 품질이야." 다 틀려. 실제로 프로덕션 코드 ship 하는 일하는 엔지니어들은 알아. 테스트는 정확성을 증명 하지 않아 — 샘플링 해. TDD 는 여러 워크플로우 중 하나일 뿐이야. Coverage 는 후행 지표라서, 쓰레기 코드를 100% 커버해도 그래도 쓰레기야.

일하는 엔지니어의 답

진짜 이유는 이거야: 코드를 바꿀 때 숨 안 참아도 되게 하려고. 6개월 후에 auth handler 를 refactor 해야 할 거고, Next.js major 두 칸 올려야 할 거고, 갑자기 abandoned 된 라이브러리를 교체해야 할 거야. 그때 너랑 "내가 방금 까먹은 뭔가를 깬 거 아닐까?" 사이를 막아주는 게 test suite 야.

나머지는 — coverage 퍼센트, 코드 리뷰 체크 마크, 심지어 버그를 그 순간 잡는 것 자체 — 다 부수 효과야. 본질 가치는 신뢰지. 통과하는 suite 가 너에게 '바꿀 권리' 를 사줘.

모든 테스트의 모양 — AAA

Arrange. Act. Assert.

Arrange 는 세계를 준비해 — 입력, fixture, mock 다 세팅. Act 는 대상 코드를 실행 — 함수 호출, 버튼 클릭. Assert 는 결과 확인 — 뭐가 돌아왔는지, 뭐가 바뀌었는지, 뭐가 불렸는지.

너무 작아서 세 단계가 한 줄에 뭉치는 테스트도 있어. 근데 구조는 그대로야. 테스트가 정신없게 느껴지면 보통 AAA 가 망가진 거야 — act 안에서 너무 많이 arrange 한다거나, assertion 이 본문 곳곳에 흩어졌다거나. 떼어내면 테스트가 알아서 읽혀.

테스트는 보험이지 종교가 아냐. 보험 드는 이유는 "조심할게" 라는 대안이 새벽 2시 future-you 와 만나면 안 통하기 때문이지. 테스트도 같은 이유로 해.

테스트가 아닌 것

테스트는 정확성의 증명 이 아냐 — 모든 입력을 열거할 수 없어. 테스트는 스펙 도 아냐 — 스펙은 바뀌고, 테스트는 커밋이야. 테스트는 문서 도 아냐 — 대체로. 좋은 테스트 이름은 문서처럼 읽히긴 하지만. 테스트는 코드 리뷰 도 아냐. 초록 suite 가 좋은 설계를 의미하지도 않아.

테스트가 뭐냐면: 작은 낙하를 잡는 안전망, 큰 낙하를 알리는 경보. 그게 다야. 그거면 충분해.

Code

AAA 모양이 명시된 첫 Vitest 테스트·typescript
// sum.test.ts
import { describe, it, expect } from 'vitest';
import { sum } from './sum';

describe('sum', () => {
  it('adds two numbers', () => {
    // Arrange
    const a = 2;
    const b = 3;

    // Act
    const result = sum(a, b);

    // Assert
    expect(result).toBe(5);
  });

  it('handles negative numbers', () => {
    // AAA all on one line — still AAA.
    expect(sum(-1, 1)).toBe(0);
  });
});
테스트 대상 함수·typescript
// sum.ts
export function sum(a: number, b: number): number {
  return a + b;
}

External links

Exercise

최근에 쓴 pure function 하나 골라 — 한 줄짜리도 좋아. 세 개 테스트 짜: happy path 하나, edge case 하나, 명시적인 실패 케이스 하나 (expect(...).toThrow()expect(...).not.toBe(...)). 아직 Vitest 설치 안 해도 돼 — 설치된 것처럼 테스트 파일만 써봐. 핵심은 AAA 모양을 느끼는 거지 초록 체크 받는 게 아냐.
Hint
'React 가 렌더링하는지 검증' 이나 '라이브러리가 자기 output 반환하는지 검증' 같은 테스트로 손이 가면 한 발 물러서. 테스트는 *너의* 로직을 검증해야 해, 남의 거 말고. 너의 가장 작은 조각부터 골라.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.