본문으로 건너뛰기
중급약 10시간 (예상)

단위·통합 테스트

xUnit 계열 프레임워크, 목·스텁·스파이, 비결정적 요소 다루기, 커버리지 리포트의 함정, 프런트엔드 컴포넌트 테스트.

학습 목표

이 모듈 한 줄 요약 — "개발자가 짜 둔 시험을 읽을 줄 알게 된다". 개발자는 자기 코드를 확인하는 시험을 코드로 짜 둔다. 그것을 읽을 수 있으면 이미 확인된 것과 아직 아무도 안 본 것이 갈린다. 직접 짜는 것은 그다음이고, 먼저 읽는 쪽부터 한다.

이 모듈을 마치면 단위 테스트와 통합 테스트의 차이를 설명하고, xUnit 계열 프레임워크의 공통 구조를 읽을 수 있다. 목·스텁·스파이 같은 테스트 더블을 구분해서 이해하고, 시간·랜덤·외부 API 같은 비결정적 요소를 테스트에서 어떻게 통제하는지 익힌다. 커버리지 리포트가 왜 그 자체로 품질을 보장하지 않는지, 그리고 프런트엔드 컴포넌트를 사용자 관점에서 테스트하는 법까지 다룬다.

완료 후 할 수 있는 것

  • 단위 테스트와 통합 테스트의 범위와 목적 차이를 설명할 수 있다
  • xUnit 계열 프레임워크(JUnit, pytest, Jest 등)의 공통 구조를 읽을 수 있다
  • 더미·스텁·스파이·목·페이크 같은 테스트 더블의 종류를 구분할 수 있다
  • 시간·랜덤 값·외부 API에 의존하는 코드를 테스트 가능하게 통제하는 법을 설명할 수 있다
  • 라인 커버리지와 브랜치 커버리지의 차이, 커버리지 100%의 함정을 설명할 수 있다
  • 프런트엔드 컴포넌트를 사용자 관점에서 테스트하는 접근을 설명할 수 있다

채용시장에서의 위치

"단위 테스트 코드 리뷰 경험", "Jest/pytest 사용 경험" 같은 문구는 자동화 QA·SDET 채용에서 자주 등장한다. 이 모듈은 여러분이 직접 단위 테스트 코드를 완벽히 짜는 개발자 수준이 되는 것을 목표로 하지 않는다 — 대신, 개발자가 작성한 단위 테스트가 실제로 무엇을 검증하고 있는지 읽고 판단할 수 있는 능력에 초점을 맞춘다. 이건 스테이지 4(자동화 전략)에서 "무엇을 자동화하고 무엇을 수동으로 남길지" 판단할 때, 그리고 스테이지 6(AI 시대의 QA)에서 AI가 작성한 테스트 코드를 검증할 때 그대로 이어지는 기초 체력이다.

레슨 (6개)

  1. 입문약 20분

    단위 테스트란 무엇인가: 범위, AAA 패턴, 통합 테스트와의 차이

    단위 테스트는 코드에서 가장 작은 단위를 독립적으로 검증한다. 통합 테스트와의 범위 차이, 그리고 Arrange-Act-Assert라는 공통 구조를 이해한다.

  2. 입문약 20분

    xUnit 계열 프레임워크: JUnit·pytest·Jest의 공통 구조

    언어마다 도구 이름은 다르지만(JUnit, pytest, Jest), xUnit 계열 프레임워크는 테스트 러너, 어서션, setup/teardown이라는 같은 뼈대를 공유한다.

  3. 중급약 25분

    목·스텁·스파이: 테스트 더블의 종류와 쓰임

    진짜 이메일 서비스나 결제 게이트웨이 없이도 테스트할 수 있는 이유는 가짜 대역, 테스트 더블 덕분이다. 더미·스텁·스파이·목·페이크를 구분한다.

  4. 중급약 20분

    비결정적 요소 다루기: 시간, 랜덤, 외부 API 통제하기

    현재 시각이나 랜덤 값에 의존하는 테스트는 실행할 때마다 결과가 달라질 수 있다. 이런 비결정적 요소를 통제해서 항상 같은 결과가 나오게 만드는 법을 익힌다.

  5. 중급약 20분

    커버리지 리포트의 함정: 라인 커버리지 vs 브랜치 커버리지

    커버리지 100%가 "결함이 없다"는 뜻이 아니라는 건 모듈 6에서 이미 배웠다. 여기서는 그 이유를 코드 수준에서, 라인 커버리지와 브랜치 커버리지의 차이로 구체적으로 이해한다.

  6. 중급약 20분

    프런트엔드 컴포넌트 테스트: 사용자 관점으로 화면 조각 검증하기

    버튼, 폼, 카드 같은 화면 컴포넌트도 단위 테스트할 수 있다. 구현 세부사항이 아니라 사용자가 보고 누르는 것을 기준으로 테스트하는 접근을 익힌다.

이 모듈의 실습

실습은 별도 저장소에서 진행합니다. 새 탭으로 열립니다.