code coverage tutorial
이 포괄적 인 자습서에서는 소프트웨어 테스트에서 코드 커버리지가 무엇인지, 유형, 이점 및 단점에 대해 설명합니다.
소프트웨어 개발 회사의 궁극적 인 목표는 좋은 품질의 소프트웨어를 개발하는 것입니다. 이 목표를 달성하려면 소프트웨어를 철저히 테스트해야합니다.
따라서 테스트는 소프트웨어 응용 프로그램 개발의 필수적인 부분입니다. 따라서 개발 된 소프트웨어는 개발자가 검토 한 다음 (단위 테스트 단계에서 수행됨) QC 팀에 전달되어 버그가 최소화되거나 없는지 확인하기 위해 철저한 테스트를 거치는 것이 필수적입니다.
소프트웨어는 테스트를 위해 실제 테스트 팀에 릴리스되기 전에 단위 테스트를 거칩니다. 이 테스트에는 코드 수준의 테스트가 포함되므로 개발자가 수행합니다. 이는 테스트중인 코드의 각 부분이 예상대로 작동하는지 확인하기 위해 수행됩니다.
여기에서 개발 된 작은 코드 덩어리는 정확성을 보장하기 위해 격리 된 상태로 테스트됩니다. 하지만 개발자가 자주 떠오르는 질문은 얼마나 많은 단위 테스트를 수행해야 하는가 이에 대한 답은 코드 커버리지에 있습니다.
이 튜토리얼은 코드 커버리지가 무엇이며 왜 필요한지에 대한 깊은 지식을 제공합니다. Test Coverage와 어떻게 다른지 알게 될 것입니다.
또한 코드 커버리지에 사용되는 도구와 방법론을 살펴보고이 튜토리얼이 끝날 무렵에는 단점과 함께 이점을 확인할 수 있습니다. 코드 커버리지와 관련된 신화 중 일부도 여기에서 다룰 것입니다.
학습 내용 :
코드 커버리지 란?
이것은 중요한 단위 테스트 메트릭입니다. 단위 테스트의 효과를 아는 데 유용합니다. 테스트하는 동안 실행될 소스 코드의 백분율을 나타내는 측정 값입니다.
간단히 말해서 테스트 중에 소프트웨어 프로그램 또는 응용 프로그램의 소스 코드가 실행되는 범위를 코드 커버리지라고합니다.
테스트가 모든 분기, 조건 또는 루프를 포함하여 코드 전체를 실행하는 경우 가능한 모든 시나리오에 대한 완전한 커버리지가 있으므로 코드 커버리지가 100 %라고 말할 수 있습니다. 이를 더 잘 이해하기 위해 예를 들어 보겠습니다.
다음은 두 개의 숫자를 더하고 결과 값에 따라 결과를 표시하는 데 사용되는 간단한 코드입니다.
Input a, b Let c = a + b If c <10, print c Else, print ‘Sorry’
위 프로그램은 'a'와 'b'의 두 가지 입력을받습니다. 둘의 합은 변수 c에 저장됩니다. c 값이 10보다 작 으면‘c’값이 인쇄되고 그렇지 않으면‘Sorry’가 인쇄됩니다.
이제 합이 항상 10 미만이되도록 a & b 값으로 위 프로그램을 검증하는 테스트가 있다면 코드의 else 부분은 실행되지 않습니다. 그러한 시나리오에서 우리는 커버리지가 완전하지 않다고 말할 것입니다.
이것은 코드 커버리지의 의미를 명확히하기위한 작은 예일뿐입니다. 더 많이 탐색할수록 더 명확 해집니다.
코드 커버리지가 필요한 이유
(영상 출처 )
다양한 이유 때문에 코드 커버리지가 필수적이며 그 중 일부는 다음과 같습니다.
셀레늄 테스트 인터뷰 질문 및 답변
- 코드 커버리지가 좋지 않은 소프트웨어와 비교할 때 소프트웨어에 버그가 적다는 것을 확인하는 데 도움이됩니다.
- 코드 품질 향상을 지원함으로써 더 나은 '품질'소프트웨어를 제공하는 데 간접적으로 도움이됩니다.
- 테스트 효과 (코드를 테스트하기 위해 작성된 단위 테스트의 효율성)를 아는 데 사용할 수있는 측정 값입니다.
- 테스트되지 않은 소스 코드 부분을 식별하는 데 도움이됩니다.
- 현재 테스트 (단위 테스트)가 충분한 지 여부와 더 많은 테스트가 필요한지 확인하는 데 도움이됩니다.
코드 커버리지 대 테스트 커버리지
코드 커버리지와 테스트 커버리지의 차이점을 이해하기 위해 먼저 테스트 커버리지의 의미를 이해하겠습니다.
테스트 범위
소프트웨어를 테스트하는 동안 예상 테스트의 몇 부분을 다루 었는지 측정합니다. 으로 ‘예상 테스트’ 우리는 주어진 소프트웨어를 테스트하기 위해 실행되도록 작성된 완전한 테스트 케이스 세트를 의미합니다.
소프트웨어를 테스트하기 위해 총 500 개의 테스트 케이스가 작성되었다고 가정합니다. 이제 테스트 활동의 일부로 300 개의 테스트 케이스 만 실행되었습니다. 시간 부족 때문이라고 가정 해 봅시다. 이 경우 아래는 테스트 범위입니다.
테스트 범위 = (실행 된 테스트 케이스 / 총 테스트 케이스) * 100
= (300/500) * 100
= 60 %
이것을 코드 커버리지와 비교해 봅시다.
코드 커버리지
코드를 테스트하는 동안 애플리케이션의 소스 코드가 실행되는 정도를 나타내는 척도입니다. 따라서 소스 코드가 테스트되는 정도를 보여줍니다.
500 줄의 코드로 응용 프로그램을 테스트한다고 가정하면 400 줄의 코드 만 테스트에 의해 실행됩니다. 이것이 실행되지 않는 특정 루프 / 조건 때문이라고 가정 해 보겠습니다. 이 경우 아래는 코드 커버리지입니다.
코드 커버리지 = (실행 된 코드 줄 수 / 총 코드 줄 수) * 100
= (400/500) * 100
= 80 %
다음은 코드 커버리지와 테스트 커버리지의 차이점입니다.
테스트 범위 | 코드 커버리지 |
---|---|
소프트웨어를 테스트하는 동안 예상되는 테스트의 어느 정도가 다루어 졌는지 측정합니다. | 코드를 테스트하는 동안 애플리케이션의 소스 코드가 실행되는 정도를 나타내는 척도입니다. |
테스트 범위는 아래 공식을 사용하여 계산할 수 있습니다. 테스트 범위 = (실행 된 테스트 케이스 / 총 테스트 케이스) * 100 | 코드 커버리지는 아래 공식을 사용하여 계산할 수 있습니다. 코드 커버리지 = (실행 된 코드 줄 수 / 총 코드 줄 수) * 100 |
방법론
여기에서는 코드 커버리지를 측정하는 데 사용할 수있는 / 사용할 수있는 다양한 방법에 대해 설명합니다.
이러한 방법론을 이해하기 위해 아래 코드 스 니펫을 살펴 보겠습니다.
Add (int a, int b) { If (b > a) { b = b - a Print b } If (a > b) { b = a – b Print b } Else Print ‘0’ }
명세서 범위
이 방법론은 소스 코드의 모든 가능한 실행 가능한 코드 명령문이 한 번 이상 실행되었는지를 알려주는 측정입니다. 소스 코드의 각 줄이 테스트에서 적어도 한 번은 커버되도록하는 방법입니다.
이것은 간단하게 들릴 수 있지만 진술 범위를 측정하는 동안주의가 필요합니다. 그 이유는 소스 코드에서 입력 값에 따라 실행되지 않는 특정 조건이있을 수 있기 때문입니다.
이것은 모든 코드 라인이 테스트에서 다루어지지 않는다는 것을 의미합니다. 따라서 소스 코드에서 이러한 모든 조건을 다루기 위해 다른 입력 값 세트를 사용해야 할 수도 있습니다.
예를 들면 위의 소스 코드에서 입력 값을 2 & 3으로 취하면 코드의 'Else'부분이 실행되지 않습니다. 그러나 입력 값이 3 및 2 유형이면 코드의 'If'부분이 실행되지 않습니다.
소프트웨어 테스트의 버그는 무엇입니까?
이것은 우리의 성명서 적용 범위의 값이 100 %가 아니라는 것을 의미합니다. 이러한 경우, 100 % Statement Coverage를 보장하기 위해 세 가지 ((2, 3), (3, 2), (0, 0)) 값 세트로 테스트를 실행해야 할 수 있습니다.
기능 범위
이름에서 알 수 있듯이이 방법론은 테스트 중에 소스 코드에있는 기능이 다루는 범위를 측정합니다. 소스 코드에있는 모든 함수는 테스트 실행 중에 테스트됩니다. 다시 말하지만, 함수가 철저히 테스트되도록 다양한 값에 대해 이러한 함수를 테스트해야합니다.
소스 코드에는 여러 함수가있을 수 있으며 사용 된 입력 값에 따라 함수가 호출되거나 호출되지 않을 수 있습니다. 따라서 Function Coverage의 목적은 각 기능이 호출되도록하는 것입니다.
예를 들면 위의 소스 코드에서 테스트가 '추가'함수를 한 번이라도 호출하면이를 완전한 함수 커버리지라고 부릅니다.
조건 적용
조건이있는 소스 코드에서 결과는 true 또는 false의 부울 값이됩니다. Condition Coverage는 테스트가 두 값 (예 : 참, 거짓)을 모두 포함하는지 확인하는 것을 목표로합니다.
소스 코드에서 발생하는 각 조건이 참 및 거짓 상태 모두에 대해 평가 될 때 코드에 대한 조건 커버리지가 완료되었다고합니다.
예를 들면 위 코드에서 값 세트 (2, 3) 및 (4, 2)를 사용하면 조건 커버리지가 100 %가됩니다. 데이터 세트 (2, 3)이 사용되면 (b> a)는 참으로 평가되고 (a> b)는 거짓으로 평가됩니다. 마찬가지로 데이터 세트 (4, 2)가 사용되면 (b> a)는 거짓으로 평가되고 (a> b)는 참으로 평가됩니다.
따라서 두 조건 모두 값 즉, true와 false가 모두 적용됩니다. 따라서 Condition Coverage는 100 %가됩니다.
지점 범위
이 방법론은 각 조건부 구조에 나타나는 모든 분기가 소스 코드에서 실행되도록하는 것을 목표로합니다. 예를 들어, 위 코드에서 모든 'If'문과 함께 수반되는 모든 'Else'문은 100 % Branch Coverage 테스트에 포함되어야합니다.
예를 들면 위 코드에서 값 세트 (2, 3), (4, 2), (1, 1)을 사용하면 Branch Coverage가 100 %가됩니다. 데이터 세트 (2, 3)가 사용되면 (b> a) 첫 번째 'If'분기가 실행됩니다. 마찬가지로 데이터 세트 (4, 2)가 사용되면 (a> b)가 true로 평가되고 두 번째 'If'분기가 실행됩니다.
그런 다음 데이터 세트 (1, 1)를 사용하여‘Else’분기가 참으로 평가되고 실행됩니다. 따라서 100 % 지점 커버리지를 보장합니다.
지점 범위 대 조건 범위
Branch Coverage는 종종 Condition Coverage와 혼동되지만 둘은 다릅니다.
간단한 예를 들어 이해합시다.
If (a >0) & (b >0) Then Print “Hello” Else Print “Bye”
완료하는 데 필요한 데이터 세트를 적어 보겠습니다. 지점 범위 :
(1, 1) –이 경우‘a’와‘b’가 모두 참이므로 If 조건이 실행됩니다.
(1, 0) –이 경우‘a’는 참이고‘b’는 거짓이므로 코드의 Else 부분이 실행됩니다.
우리가 알고 있듯이 Branch Coverage의 목적은 모든 분기를 한 번 이상 실행하고이 목적을 달성하는 것입니다.
조건 적용 :
(1, 0) –이 경우‘a’는 참이고‘b’는 거짓입니다.
(0, 1) –이 경우‘a’는 거짓이고‘b’는 참입니다.
Condition Coverage의 목적은 실행되는 모든 조건에 대해 각각 참과 거짓을 얻는 것이며이 목적은 여기서 달성됩니다.
else 부분이 Condition 커버리지에서 실행되지 않는다는 것을 알았습니까? 이것은 조건 보장이 지점 보장과 다른 곳입니다.
코드 커버리지를위한 도구
모든 소프트웨어의 코드 커버리지를 측정하기 위해 시장에서 사용할 수있는 여러 도구가 있습니다.
다음은 참조 용 도구 중 일부입니다.
- Parasoft JTest
- Testwell CTC ++
- 적용 범위
- JaCoCo
- CodeCover
- BullseyeCoverage
- EMMA
- OpenCover
- NCover
- 스 퀴시 COCO
- CoverageMeter
- GCT
- TCAT C / C ++
- Gretel
- JCov
추천 자료 => 코드 커버리지 도구
위 링크에는 이러한 도구에 대한 다음 정보가 포함됩니다.
- 주요 특징들
- 라이센스 유형
- 공식 URL
- 장점과 단점
- 최신 버전
혜택
위에서 볼 수 있듯이 다음과 같은 이유로 매우 유용한 테스트 메트릭입니다.
- 소스 코드에서 테스트에 의해 테스트되지 않거나 발견되지 않은 영역을 식별하는 데 도움이됩니다.
- 사용 / 사용 불능 코드를 식별하여 코드 품질을 향상시키는 데 유용합니다.
- 단위 테스트의 효과는 Code Coverage의 도움으로 알 수 있습니다.
- 이러한 메트릭을 사용하여 더 나은 품질의 소프트웨어를 제공 할 수 있습니다.
단점
- 100 % 코드 커버리지를 목표로하려고 시도하면 테스트의 견고성이 부족하여 결함이 발생하기 쉬운 시나리오를 포착하지 못하는 경우가 있습니다.
- 일반적인 인식과 달리 설계된 소프트웨어가 모든 요구 사항을 충족하는지 보장 할 수 없습니다.
신화 대 사실
신화 | 것 |
---|---|
100 % 코드 커버리지는 소프트웨어에 버그가 없음을 보장합니다. | 아니요, 100 % 코드 적용 범위는 버그없는 소프트웨어를 보장 할 수 없습니다. QC 팀의 좋은 노력과 함께 좋은 코드 커버리지는 버그가 거의 없거나 전혀없는 소프트웨어를 보장 할 수 있습니다. |
100 % 코드 커버리지는 작성된 코드가 완벽하다는 것을 의미합니다. | 아니요, 사실 중요한 요구 사항이 처음부터 코드에 의해 캡처되지 않은 경우 코드 커버리지가 100 % 임에도 불구하고 코드는 완벽하다고 할 수 없습니다. |
코드 커버리지는 소프트웨어 제품에서 수행 된 테스트의 효율성을 측정합니다. | 아니요, 코드 커버리지는 단위 테스트의 효율성, 즉 소프트웨어의 소스 코드에서만 실행되는 테스트를 테스트하는 데 사용되는 조치 일뿐입니다. |
FAQ
Q # 1) 허용되는 코드 커버리지는 무엇입니까?
대답: 소프트웨어 코드를 단위 테스트하는 동안 100 % 코드 커버리지를 달성하는 것이 목표가되어서는 안됩니다. 그러나, 왜 안됩니까? 이유를 이해하려면 근본적인 의미를 이해하기 위해 조금 더 깊이 들어가야 할 수도 있습니다.
100 % 커버리지를 목표로 할 때 테스트 설계의 모든 초점이 각 문, 루프, 분기 또는 조건이 테스트되는지 확인하는 데 집중되는 경우가 더 자주 발생합니다. 그래서 우리는 시간을 고려할 가치가 없을 수도있는 너무 많은 노력을 기울이고 있습니다.
또한, 높은 범위에 집중하면 결함이있을 가능성이있는 중요한 시나리오를 놓치게됩니다. 우리가 목표로하는 것은 각 코드 줄을 테스트하는 것입니다.
높은 코드 커버리지에 초점을 맞추는 것이 항상 그다지 중요하지 않으며 다른 코드를 테스트하기 위해 목표로 삼는 고정 된 숫자도 아닙니다. 그러나 일반적으로 75 % – 80 %의 범위가 이상적인 숫자 여야합니다.
코드를 테스트하는 동안 주요 초점은 중요하고 오류가 발생할 가능성이있는 시나리오를 다루는 데 있어야합니다. 이것이 누락되면 100 % 코드 커버리지가 있음에도 불구하고 우리 테스트는 단순히 테스트 효율성이 떨어질 것입니다.
질문 # 2) 내 코드 커버리지를 어떻게 확인합니까?
대답: 코드 테스트 용으로 설계된 테스트를 통해 얻을 수있는 코드 커버리지의 비율을 테스트하기 위해 시장에 여러 도구가 있습니다. 사용하는 프로그래밍 언어에 따라 다양한 도구가 있습니다.
그중 일부는 다음과 같습니다.
- 자바 -커버리지, JaCoCo
- 자바 스크립트 – Blanket.js, 이스탄불
- 파이썬 -Coverage.py
- 루비 -SimpleCov
이러한 도구를 사용하면 코드의 어느 부분이 실행되고 어떤 부분이 테스트에서 누락되는지 파악하는 데 도움이되는 테스트의 전체 커버리지 보고서를 얻을 수 있습니다.
질문 # 3) 코드 커버리지가 좋은 지표입니까?
대답: 실제 시나리오에서 이것은 어느 정도 특정 방식으로 유용합니다.
제한 사항을 먼저 살펴보면 100 % 적용 범위를 갖는다 고해서 코드에 버그가 없음을 보장하지 않으며 코드에서 모든 요구 사항이 적용되었음을 보장하지 않습니다. 즉, 100 % 코드 적용 범위에도 불구하고 코드에 버그가있을 가능성이 큽니다. 그 이유는 커버리지가 모든 시나리오가 테스트되었음을 보장하지 않기 때문입니다.
또한 코드를 작성하는 동안 요구 사항을 건너 뛴 경우 코드 커버리지의 일부로 처리되는 코드와 요구 사항 매핑이 없습니다.
하지만 코드 커버리지를 메트릭으로 사용할 때 코드의 각 줄을 테스트하는 기본 요구 사항을 다뤘는지 여부를 알 수 있다는 사실을 부인할 수 없습니다. 이 커버리지 백분율은 단위 테스트로 코드의 몇 부분이 실행되고 있는지에 대한 아이디어를 제공합니다.
크롬을위한 최고의 광고 차단 확장 프로그램
우리는 얼마나 많은 코드가 실행되지 않을 것인지 알게됩니다. 이것은 우리가 얼마나 많은 단위 테스트가 필요한지 그리고 코드의 어떤 부분에 필요한지를 결정하는 데 도움이됩니다.
따라서 커버리지가 좋지 않으면 단위 테스트의 비 효율성에 대한 아이디어가 제공된다는 결론을 내릴 수 있습니다. 동시에 100 % 적용 범위를 보장한다고해서 결함이없는 코드가 보장되는 것은 아닙니다. 따라서 높은 코드 커버리지 비율을 목표로하는 것의 중요성을 과도하게 강조하지 않는 균형 잡힌 접근 방식이 필요합니다.
질문 # 4) 코드 커버리지를 어떻게 개선 할 수 있습니까?
대답: JaCoCo, Istanbul 등과 같은 커버리지 도구에서 제공하는 코드 커버리지 보고서는 테스트 대상 영역과 테스트되지 않은 영역을 보여줍니다.
코드의 테스트되지 않은 부분을 알면 테스트를 수동으로 작성하거나 자동화 도구를 사용하여 테스트되지 않은 영역을 처리하여 코드 적용 범위를 늘릴 수 있습니다.
여기서 주목해야 할 중요한 점은 코드에서 함수를 테스트하기 위해 수백 줄의 코드를 작성할 수 있지만 여전히 적용 범위가 매우 적을 수 있다는 것입니다. 그 이유는 거대한 코드의 일부를 테스트하기에는 너무 깊이 들어가는 것은 코드 커버리지를 늘리는 데 도움이되지 않기 때문입니다.
따라서 목표가 적용 범위를 늘리는 것이라면 단일 함수에 깊이 들어가서 해당 단일 함수에 대한 대규모 테스트를 작성하는 대신 모든 함수, 조건 및 루프를 포함하도록주의를 기울여야합니다.
결론
오늘날의 급변하는 인터넷 세상에서 필요한 것은 고품질 소프트웨어 제품입니다.
양질의 소프트웨어를 보장하는 것은 QA 엔지니어의 책임 일뿐만 아니라 개발자의 책임이기도합니다. 따라서 코드 커버리지는 개발자 (들)가 품질 보증 팀에 양질의 제품을 제공 할 때 매우 유용합니다.
이 튜토리얼은 코드 커버리지와 그 사용에 대한 모든 것을 설명했습니다. 또한 코드 커버리지와 테스트 커버리지의 차이점을 좀 더 깊이 이해했습니다. 이 외에도 다양한 코드 커버리지 도구와 함께 사용되는 방법론을 이해했습니다.
여기에서 장점과 단점을 간략히 설명했습니다. 마지막으로 우리는 코드 커버리지와 관련된 일부 신화와 FAQ를 파헤 쳤습니다.
행복한 독서 !!