매일 업데이트
2023-04-12 11:17 10 min

유형, 도구 및 모범 사례

코드 커버리지의 중요성과 테스트 도구

소프트웨어 개발 과정에서 코드 오류는 불가피하게 발생합니다. 이러한 오류는 문법적 실수, 논리적 오류, 실행 시간 오류, 성능 문제, 데이터 오류 등 다양한 형태로 나타날 수 있으며, 심각한 문제를 야기할 수도 있습니다.

소프트웨어 개발 중 오류가 빈번하게 발생한다는 점을 고려할 때, 소프트웨어 테스트는 매우 중요한 단계입니다. 적절하고 효과적인 테스트는 사용자 요구를 충족하는 고품질 소프트웨어를 생성할 뿐만 아니라, 규정을 준수하고 잠재적인 공격자가 악용할 수 있는 취약점을 최소화합니다.

소프트웨어 테스트는 자동화된 테스트, 단위 테스트, 통합 테스트, 또는 시스템 테스트와 같이 다양한 방식으로 수행될 수 있습니다. 이때 중요한 문제는 소프트웨어가 얼마나 철저하게 테스트되었는지 판단하는 방법입니다. 즉, 수행된 테스트가 충분한지, 모든 코드가 테스트되었는지, 아니면 일부 코드는 전혀 테스트되지 않았는지 확인해야 합니다.

이러한 질문은 소프트웨어 테스트 과정에서 흔히 발생하며, 코드 커버리지가 중요한 이유를 보여줍니다. 코드 커버리지는 테스트 중인 소프트웨어에서 실행된 테스트에 의해 실제로 실행된 코드의 양을 측정하는 소프트웨어 테스트 지표입니다. 코드 커버리지 결과는 백분율로 표시되며, 테스트를 통해 코드의 어느 부분을 다루었는지 나타냅니다.

예를 들어, 테스트를 실행하여 60%의 코드 커버리지를 달성했다면, 이는 코드의 40%가 테스트되지 않았음을 의미하며, 이 부분에 오류나 취약점이 있을 가능성이 있습니다. 따라서 코드 커버리지는 소프트웨어 테스트의 효율성과 완전성을 분석하는 데 필수적이며, 소프트웨어가 출시되기 전에 충분히 테스트되었는지 확인하는 데 도움이 됩니다.

높은 코드 커버리지를 목표로 해야 하지만, 100% 코드 커버리지가 반드시 소프트웨어에 오류가 없다는 의미는 아닙니다. 특히 항공우주 및 의료와 같이 생명과 직결되는 중요한 산업에서는 규정에 따라 테스트 중에 100% 소프트웨어 커버리지를 요구합니다.

코드 커버리지 지표의 종류

소프트웨어 테스트 중에 측정할 수 있는 다양한 코드 커버리지 지표가 있습니다. 주요 지표는 다음과 같습니다:

  • 문장 커버리지(Statement Coverage): 테스트 중에 실행된 소스 코드의 실행 가능한 문장의 비율을 측정합니다.
  • 함수 커버리지(Function Coverage): 테스트 중에 호출된 정의된 함수의 백분율을 측정합니다.
  • 분기 커버리지(Branch Coverage): 소스 코드의 모든 결정 지점에서 실행된 분기 또는 가능한 경로의 백분율을 측정합니다. 이는 if, switch 문과 같은 조건 제어 구조에서 발생하는 모든 분기가 충분히 테스트되었는지 확인하는 데 사용됩니다.
  • 조건 커버리지(Condition Coverage): 참과 거짓 값 모두에 대해 테스트된 부울 표현식의 백분율을 측정합니다.
  • 루프 커버리지(Loop Coverage): 테스트 중에 실행된 소스 코드의 루프 비율을 측정합니다.
  • 경로 커버리지(Path Coverage): 테스트된 소스 코드에서 가능한 모든 실행 경로의 백분율을 측정합니다.

이러한 지표들은 일반적으로 코드 커버리지 보고서에 포함됩니다.

코드 커버리지 모범 사례

코드 커버리지의 효율성과 품질을 보장하기 위해 따라야 할 몇 가지 모범 사례가 있습니다:

명확한 커버리지 목표 설정

각 테스트 커버리지 지표에 대한 목표 커버리지 비율을 설정해야 합니다. 이는 명확한 테스트 목표를 제공할 뿐만 아니라 팀의 노력을 코드 커버리지 향상에 집중시켜 소프트웨어 결함을 줄이는 데 도움이 됩니다. 또한 소프트웨어 개발 과정에서 테스팅에 충분한 주의를 기울이는지 확인하는 데도 유용합니다.

테스트 품질에 집중

코드 커버리지는 단순히 테스트된 코드의 비율을 나타낼 뿐, 코드가 제대로 테스트되었는지, 버그가 없는지를 나타내지는 않습니다. 따라서 단순히 코드 커버리지를 100%에 가깝게 만드는 데 집중하기보다는, 소프트웨어를 올바르게 테스트하고 가치를 더하는 효과적인 테스트 작성에 집중해야 합니다.

자주 변경되는 코드의 코드 커버리지 증가

대규모 프로젝트에서는 높은 코드 커버리지를 달성하기 어려울 수 있습니다. 하지만 시간이 지남에 따라 코드 커버리지를 개선하기 위해 노력해야 합니다. 이를 위해 프로젝트 코드 기반에 대한 모든 새로운 커밋에서 90% 이상의 높은 코드 커버리지를 요구하는 것이 좋습니다. 이는 실현 가능할 뿐만 아니라 소프트웨어 변경 사항에 대한 코드 커버리지를 확보하는 데 효과적입니다.

코드 커버리지 데이터 측정 및 분석

코드 커버리지 결과를 활용하여 아직 테스트가 필요한 영역을 식별하고, 코드 커버리지가 낮은 영역을 우선적으로 테스트해야 합니다. 코드 커버리지 데이터를 분석하여 애플리케이션에서 아직 테스트되지 않은 중요한 부분을 찾아내고, 테스트되지 않은 부분을 완전히 테스트하기 위한 노력을 집중해야 합니다. 이러한 접근법은 소프트웨어의 품질을 개선하고, 오류 발생 가능성을 줄이는 데 도움이 됩니다.

코드 커버리지와 테스트 커버리지

코드 커버리지와 테스트 커버리지는 모두 테스트의 효과를 확인하는 데 사용되지만, 용도와 측정 대상이 다릅니다.

테스트 커버리지는 작성된 테스트가 소프트웨어의 요구 사항을 얼마나 다루는지를 측정하는 데 사용됩니다. 각 소프트웨어 요구 사항이 제대로 테스트되었는지 확인하고, 요구 사항 충족과 관련하여 소프트웨어가 얼마나 잘 테스트되었는지 판단하는 데 사용됩니다. 테스트 커버리지 결과는 테스트된 소프트웨어 요구 사항의 백분율로 표시되며, 일반적으로 품질 보증 전문가가 수행합니다.

반면, 코드 커버리지는 작성된 테스트를 통해 실행된 소스 코드의 백분율을 측정하는 데 사용됩니다. 코드 커버리지 결과는 소스 코드의 문장, 함수, 경로, 루프, 분기 및 조건이 작성된 단위 테스트를 통해 실행된 범위를 보여줍니다. 코드 커버리지는 작성된 테스트가 소스 코드를 얼마나 잘 다루는지 평가하는 데 사용되며, 일반적으로 소프트웨어 개발자가 수행합니다.

코드 커버리지는 소프트웨어 테스트를 수행하는 동안 측정해야 하는 중요한 지표입니다. 다음은 코드 커버리지 분석에 유용한 몇 가지 도구입니다.

클로버 (Clover)

Clover는 호주 소프트웨어 회사인 Atlassian에서 개발한 오픈 소스 코드 커버리지 도구입니다. 순수하게 Java로 작성되었으며 Java Runtime Environment를 충족하는 모든 운영 체제에서 실행할 수 있습니다.

Clover는 Java, Groovy, AspectJ 프로그래밍 언어로 작성된 코드의 코드 커버리지를 측정하는 데 사용할 수 있습니다. JUnit, TestNG, Spock과 같은 테스트 프레임워크를 지원하며, IntelliJ IDEA 및 Eclipse와 같은 IDE와도 통합할 수 있습니다.

Clover는 메소드, 문장, 분기, 전역 및 테스트별 커버리지와 같은 다양한 코드 커버리지 지표를 측정할 수 있습니다. 또한 테스트 최적화에 사용할 수 있는 고도로 구성 가능한 HTML 보고서를 생성할 수 있습니다. 보고서는 PDF, XML, JSON 또는 일반 텍스트로도 생성할 수 있습니다. Clover의 주요 장점은 다양한 도구와 통합이 가능하며, 지속적으로 개발 및 개선되고 있다는 점입니다.

자코코 (JaCoCo)

JaCoCo는 EclEmma 팀에서 개발한 Java 프로그래밍 언어용 무료 코드 커버리지 라이브러리입니다. 이 라이브러리는 Eclipse IDE용 무료 Java 코드 커버리지 도구인 EclEmma에 구현되어 있습니다.

JaCoCo는 Java 소스 코드 편집기에서 결과가 즉시 요약되고 강조 표시되는 풍부한 커버리지 분석 기능을 제공합니다. 또한 사용자가 커버리지 결과를 메소드 수준까지 드릴다운할 수 있도록 지원합니다. 결과는 소스 코드에서 실행된 테스트에 의해 완전히, 부분적으로 또는 아직 다루지 않은 코드 라인을 강조 표시하는 사용자 정의 가능한 색상 코드를 사용하여 표시됩니다. 여러 테스트 실행 결과를 병합하여 소스 코드의 전체 코드 커버리지를 확인할 수 있습니다.

JaCoCo는 가벼운 도구이며, 코드 커버리지 분석을 위해 프로젝트를 수정하거나 다른 설정을 할 필요가 없습니다.

코베르투라 (Cobertura)

Cobertura는 Jcoverage를 기반으로 하는 무료 오픈 소스 Java 코드 커버리지 도구이며, Ant 스크립트 또는 Maven 플러그인을 통해 사용할 수 있습니다. 일반적으로 Maven 플러그인을 통해 사용하는 것이 Cobertura를 활용하는 가장 일반적인 방법입니다.

Cobertura는 Java 소스 코드에서 실행된 테스트에 의해 실행된 라인 또는 분기의 백분율을 측정합니다. 테스트 중에 실행된 문장의 백분율을 나타내는 라인 커버리지와 테스트 중에 실행된 분기의 백분율을 나타내는 분기 커버리지와 같은 지표를 제공합니다. 또한 Java 코드의 분기 수가 증가함에 따라 증가하는 복잡성 요인을 보여줍니다.

코드 커버리지 결과는 HTML 또는 XML로 표시되어 테스트되지 않은 소스 코드 부분을 보여줍니다. 테스트 커버리지 결과를 표시하는 것 외에도 Cobertura는 테스트되지 않은 코드와 버그를 찾고 도달할 수 없는 코드를 식별하는 데도 사용할 수 있습니다.

이스탄불 (Istanbul)

Istanbul은 ES6+를 지원하는 JavaScript 코드용 코드 커버리지 도구입니다. Node Package Manager를 사용하여 개발 종속성으로 모든 JavaScript 프로젝트에 설치할 수 있습니다.

Istanbul은 문장, 분기, 함수 및 라인 커버리지와 같은 코드 커버리지 지표를 제공합니다. 또한 테스트에서 다루지 않은 소스 코드 라인을 보여줍니다. 단위 테스트가 소스 코드를 실행하는 범위를 추적하기 위해 JavaScript 코드에 라인 카운터를 추가하여 이를 수행합니다. Istanbul의 코드 커버리지 결과는 터미널 또는 HTML 형식으로 출력할 수 있습니다. Istanbul은 또한 하위 프로세스, Babel 및 TypeScript 프로젝트의 소스 매핑 커버리지를 생성하는 애플리케이션을 지원합니다.

Pytest-cov

Pytest-cov는 Python 코드의 코드 커버리지 보고서를 생성하는 데 사용되는 무료 Python 플러그인입니다. Python의 패키지 설치 프로그램 Pip을 사용하여 설치되며, 명령줄에서 작동합니다.

코드 커버리지 보고서는 테스트에서 다루지 않은 Python 프로젝트의 문장을 표시하고, 테스트에서 다루는 Python 코드의 백분율을 제공합니다. Pytest-cov는 하위 프로세스 지원, xdist 지원 및 일관된 pytest 동작을 제공합니다. 테스트를 수행하는 동안 Pytest-cov의 기본 동작은 각각의 새로운 테스트 실행에 대해 새롭고 깨끗한 데이터를 보장하기 위해 기존 커버리지 데이터 파일을 삭제하는 것입니다. 하지만 사용자는 이전 테스트 실행의 코드 커버리지 테스트 결과를 결합할 수도 있습니다.

Coverage.py

Coverage.py는 Python 프로그램용 코드 커버리지 도구이며, pip를 사용하여 프로젝트에 설치됩니다.

기본적으로 라인 또는 문장 커버리지를 측정하고, 프로그램의 문장 수, 테스트에서 누락된 문장 수, 테스트의 적용 비율을 보여주는 결과를 제공합니다. 또한 Python 소스 코드에서 놓친 라인도 표시합니다. 하지만 여전히 Python 프로그램에서 분기 커버리지를 측정하도록 구성할 수 있습니다. Coverage.py는 어떤 테스트가 소스 코드의 어떤 라인을 실행했는지 알려주는 데 사용할 수 있으며, 코드 커버리지 보고서는 터미널과 HTML, XML, JSON 및 LCOV 형식으로 표시될 수 있습니다.

SimpleCov

SimpleCov는 Ruby 프로그래밍 언어용 코드 커버리지 도구입니다. Ruby의 내장 커버리지 라이브러리를 활용하여 테스트 실행 후 코드 커버리지를 결정하는 데 필요한 데이터를 수집합니다.

SimpleCov의 가장 큰 장점은 코드 커버리지 결과를 쉽게 보여준다는 점입니다. 여러 유형의 테스트 결과를 병합하여 생성된 보고서에 모든 테스트 결과가 표시되므로, 테스트되지 않은 코드 부분을 쉽게 식별할 수 있습니다. 또한 코드의 테스트된 부분과 테스트되지 않은 부분을 쉽게 식별할 수 있도록 색상 코드로 소스 코드를 표시합니다. 기본적으로 SimpleCov는 테스트의 라인 커버리지를 측정하고 보고하지만, 수행된 테스트의 분기 커버리지를 측정하고 보고하도록 구성할 수도 있습니다.

딥 커버 (Deep Cover)

Deep Cover는 Ruby 코드에 대한 정확한 코드 커버리지 도구입니다. 라인이 부분적으로 실행되는 것이 아니라 전체적으로 실행되는 경우에만 라인이 커버된 것으로 간주하여 보다 정확한 라인 커버리지 보고서를 제공합니다.

또한 테스트에서 실행되지 않은 분기가 있는지 확인하는 데 선택적으로 사용할 수 있는 노드 및 분기 커버리지에 대한 지원을 제공합니다. Deep Cover는 구성할 필요 없이 사용하기 쉬울 뿐만 아니라, Ruby의 내장 코드 커버리지 라이브러리 또는 SimpleCov와 같은 다른 코드 커버리지 도구와 함께 사용할 수 있습니다. 이러한 경우 Deep Cover는 코드 라인의 모든 항목이 완전히 실행되는 경우에만 라인을 실행된 것으로 표시하여 도구의 정확도를 높입니다.

결론

코드 커버리지가 높다고 해서 소프트웨어에 오류가 없는 것은 아니지만, 소프트웨어를 테스트할 때 고려해야 할 중요한 지표임에는 틀림없습니다. 코드 커버리지는 작성된 테스트가 소프트웨어의 소스 코드를 실제로 테스트하는 정도를 평가하는 데 필수적입니다. 또한 테스트 중에 코드 커버리지를 개선하기 위해 노력하면 프로덕션에서 오류 발생 가능성이 낮아지는, 더 잘 테스트된 소프트웨어를 얻을 수 있습니다. 따라서 소프트웨어를 테스트할 때 코드 커버리지를 측정하고 분석하는 것이 중요하며, 위에 제시된 도구들을 활용해 볼 것을 권장합니다.

또한 클라우드 기반 부하 테스트 도구를 활용하여 테스트를 강화할 수도 있습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.