1일 1CS(Computer Science)

코드 커버리지에 대해서 설명해주세요.

표자 2025. 7. 4. 11:17

코드 커버리지가 뭐예요? 🤔

코드 커버리지는 "내가 작성한 테스트가 실제 코드를 얼마나 실행했는지" 를 보여주는 지표예요!

일상생활로 비유하면, 집 청소를 할 때 "내가 방의 몇 퍼센트를 청소했는지" 를 측정하는 것과 같아요 🏠✨

커버리지의 3가지 종류 📝

1. 구문 커버리지 (Statement Coverage) 📋

  • 별명: 라인 커버리지
  • 의미: 코드의 각 줄이 실행되었는지 확인
  • 예시: 10줄의 코드 중 8줄이 실행되면 80% 커버리지
// Node.js API 예시
function calculateDiscount(price, userType) {
    let discount = 0;           // 실행됨 ✅
    if (userType === 'premium') {
        discount = 0.2;         // 테스트에서 실행 안됨 ❌
    }
    return price * (1 - discount); // 실행됨 ✅
}

2. 결정 커버리지 (Decision Coverage) 🛤️

  • 별명: 브랜치 커버리지
  • 의미: 모든 조건문이 참/거짓 경우 모두 실행되었는지 확인
  • 예시: if문이 true일 때와 false일 때 모두 테스트

일상 예시: 우산 가져가기 결정 ☂️

  • 비 온다 → 우산 가져감 (참 케이스)
  • 비 안 온다 → 우산 안 가져감 (거짓 케이스)

3. 조건 커버리지 (Condition Coverage) 🔍

  • 의미: 복합 조건문의 각 조건이 참/거짓 모두 평가되었는지 확인
  • 예시: A && B 에서 A와 B 각각이 참/거짓으로 평가되는지 확인

일상 예시: 영화 보러 가기 결정 🎬

  • 조건: 시간 있음 && 돈 있음
  • 각 조건별로 참/거짓 케이스 모두 테스트 필요

커버리지 측정 도구들 🛠️

Jest (Next.js/React 프로젝트)

npm test -- --coverage

Istanbul (Node.js)

npm install --save-dev nyc
nyc npm test

높은 커버리지 = 무조건 좋은 건가요? 🤷‍♂️

장점 👍

  • 코드 안정성 증가
  • 버그 발견 가능성 높아짐
  • 리팩토링 시 안전성 확보
  • 코드 품질 향상

한계 👎

  • 100% 커버리지 ≠ 100% 버그 프리
  • 테스트 작성 시간 증가 ⏰
  • 의미 없는 테스트 양산 가능성
  • 비즈니스 로직 검증 부족할 수 있음

실무에서는 어떻게? 💼

적정 커버리지 기준

  • 일반적: 70-80%
  • 핵심 비즈니스 로직: 90% 이상
  • 유틸리티 함수: 95% 이상

우선순위 🎯

  1. 핵심 비즈니스 로직 (결제, 인증 등)
  2. 자주 변경되는 코드
  3. 버그 발생 빈도가 높은 부분
  4. 공통 유틸리티 함수

실제 개발 시나리오 🎭

상황: Next.js로 이커머스 사이트 개발 중

// 장바구니 함수 - 높은 커버리지 필요!
function addToCart(product, quantity) {
    // 비즈니스 로직이 복잡함
}

// 단순 유틸리티 - 적당한 커버리지
function formatPrice(price) {
    return `$${price.toFixed(2)}`;
}

팁! 효과적인 커버리지 관리 💡

  1. 점진적 개선: 기존 코드에 조금씩 테스트 추가
  2. CI/CD 통합: 커버리지 임계값 설정
  3. 리포트 활용: 커버리지 리포트로 취약점 파악
  4. 팀 컨벤션: 최소 커버리지 기준 합의

< 면접 답변 >

"코드 커버리지는 테스트 케이스가 프로덕션 코드를 실행한 정도를 나타내는 지표입니다. 구문 커버리지는 코드 라인 실행 여부를, 결정 커버리지는 조건문의 참/거짓 분기 실행 여부를, 조건 커버리지는 복합 조건의 각 조건 평가 여부를 측정합니다. 높은 커버리지는 코드 안정성을 높이지만, 100% 커버리지가 버그 프리를 보장하지는 않으므로 핵심 비즈니스 로직 위주로 70-80% 수준을 목표로 하는 것이 실무적으로 적절합니다."

 

 


코드 커버리지에 대해서 설명해주세요.

백엔드와 관련된 질문이에요.

테스트 케이스들이 프로덕션 코드를 실행한 정도를 나타낸 것을 코드 커버리지(Code Coverage) 라고 합니다.

코드 커버리지는 측정하는 기준에 따라서 크게 구문 커버리지(Statement Coverage), 조건 커버리지(Condition Coverage), 결정 커버리지(Decision Coverage) 로 나뉩니다.

구문 커버리지는 라인 커버리지라고도 불립니다. 단순히 프로덕션 코드의 라인이 실행된 것을 확인합니다. 예를 들어, 5줄의 코드를 포함하는 A 메서드를 테스트했는데, 5줄 모두 실행된 경우 구문 커버리지는 100%가 됩니다.

결정 커버리지는 브랜치 커버리지라고도 불립니다. 이는 프로덕션 코드에 모든 조건식이 참이거나 거짓으로 평가되는 케이스가 최소 한 번씩 실행되는 것을 판단합니다. 예를 들어 아래와 같은 코드가 존재했을 때, 조건식이 참과 거짓으로 평가시킬 수 있는 테스트 케이스를 작성해야 결정 커버리지 기준을 만족합니다. 예를 들어, productionCode(1, 1), productionCode(0, 1)인 경우, 결정 커버리지를 만족합니다. 결정 커버리지는 코드 내에서 실행 흐름이 분기되는 모든 경로를 테스트하는 것을 목표로합니다.

public void productionCode(int a, int b) {
    if(a > 0 && b > 0) { // 조건식
    }
}

조건 커버리지는 메서드 내부의 모든 조건식이 참과 거짓으로 모두 평가되는 것을 의미합니다. 예를 들어, 위 코드에서 결정 커버리지는 a > 0 && b > 0을 참과 거짓으로 평가할 수 있는 케이스가 있어야 하는 반면에, 조건 커버리지는 각 a > 0, b > 0이 참과 거짓으로 평가되는지 확인합니다. productionCode(1, 0), productionCode(0, 1)를 입력하는 상황처럼 조건 커버리지는 만족하여도 다른 커버리지는 만족하지 못할 수 있는 상황도 존재합니다.

커버리지가 높다고 무조건 좋을까요? 🤔

커버리지가 높다는 것은 코드의 일부가 테스트에 의해 실행되어 검증되었다는 것을 의미합니다. 높은 커버리지는 일반적으로 코드의 안정성과 신뢰성을 높일 수 있지만, 이것이 무조건 항상 좋다고 말할 수는 없습니다.

또한, 커버리지가 높다고 해서 모든 버그를 찾아낼 수 있는 것은 아닙니다. 커버리지가 높더라도 테스트 케이스가 부족하거나 부적절하게 작성되었다면 여전히 중요한 버그가 발생할 수 있습니다. 또한, 모든 코드를 테스트하는 것이 현실적이지 않을 수도 있습니다. 특히 예외 상황이나 경계 조건을 모두 다루기는 어려울 수 있습니다.

추가 학습 

728x90