테스트 커버리지 혹은 코드 커버리지란
소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표중 하나이다.
즉, 테스트 코드가 실제로 프로덕션 코드를 얼마나 몇 퍼센트 검증하고 있는지를 나타낸다.
Jacoco의 코드 커버리지 리포트
코드의 커버리지 측정 기준은 여러가지가 있다.
함수(Function) 커버리지
public void a() {
// ...
}
public void b() {
// ...
}
public void c() {
// ...
}
public void d() {
// ...
}
어떤 함수가 최소 1번 이상 호췰되었는지를 기준으로 커버리지를 계산한다.
함수 내부의 모든 코드가 실행되었는지는 판단 기준에서 제외된다.
위의 경우, 4개의 함수가 있는데 a(), b() 만을 실행한다고하면 4개 중 2개의 함수를 실행하였으므로 테스트 커버리지는 50%가 된다.
함수커버리지=(실행된함수의수/전체함수의수)∗100
구문(Statement) 커버리지
라인(Line) 커버리지라고도 불리는데 프로덕션 코드의 전체 구문 중 몇 줄의 구문이 실행되었는지를 기준으로 판단한다.
public void function(int a) {
System.out.println("1"); // A
if (a > 10) { // B
System.out.println("2"); // C
}
System.out.println("3"); // D
}
위 코드의 경우, a를 10보다 작은 값으로만 테스트한다면, A ~ D 중 C는 실행되지 않을 것이므로, 4개의 구문 중, 3개의 구문만 실행되었으므로 테스트 커버리지는 75%가 된다.
구문커버리지=(실행된구문의수/전체구문의수)∗100
결정(Decision) 커버리지
브랜치(Branch) 커버리지라고도 불리며 프로덕션 코드에 조건문이 있는 경우, 조건문의 전체 조건식이 true 인 케이스와 false 인 케이스 2가지가 최소한 한번 실행되면 충족이 된다.
if (x >= -2 && y < 4) {
// ...
}
// x >= -2 && y < 4 는 전체 조건
// x >= -2 와 y < 4 는 개별 조건
위 코드의 경우 x=3, y=3 과 x=-3, y=5 를 테스트 케이스 2개를 실행하는 경우, 전체 조건식의 true, false를 한번씩 만족하였으므로 결정 커버리지 기준을 만족한다.
조건(Condition) 커버리지
조건 커버리지는 결정 커버리지와 다르게, 전체 조건식이 아니라 개별 조건식을 기준으로 판단한다. 개별 조건식이 모두 true, false를 한번씩 실행이 되면 조건 커버리지 기준을 만족한다.
조건/결정(Condition / Decision) 커버리지
조건/결정 커버리지는 조건 커버리지와 결정 커버리지 모두를 만족할 때 충족되는 조건이다.
즉, 개별 조건과 전체 조건 모두 최소 한번씩 true, false가 선택되어야 한다.
로버트 마틴은 모조리 다 해야 한다며, 100% 테스트 커버리지를 권장이 아니라 강력히 요구하지만 사실 실제 업무를 하다보면 모든 커버리지를 만족하지 못한다.
일반적으로는 80% 커버리지가 좋은 목표라고 한다.
나의 경우는 사실 업무를 하면서 크게 코드 커버리지를 고려해 본 적이 없다.
단위 테스트와, 통합 테스트를 통해 기본 동작만을 고려하였다.
개발자가 요구 사항을 잘못 이해하고 작성하여, 테스트 코드를 작성했을 수도 있을 수도 있고 테스트 코드 자체를 잘못 작성했을수도 혹은 테스트 케이스를 빠트릴 수도 있다.
높은 커버리지가 무조건적인 애플리케이션이 요구사항에 맞게 정상 동작함을 보장하지는 않으며, 너무 믿어서는 안된다.
대표적으로는 구문 커버리지가 많이 사용이 된다.
구문 커버리지를 만족한다면, 모든 코드를 테스트 코드가 커버했다고는 말을 할 수는 있다.
조건, 결정 커버리지의 코드에서 모든 조건식에 대해서 테스트했다고는 보장할 수 없지만,
조건문 내부의 코드가 실행되었을 때 문제가 없다는 것은 보장할 수 있다.
구문 커버리지를 만족하면 모든 시나리오를 테스트한다는 보장은 할 수 없지만, 어떤 코드가 실행되더라도 해당 코드는 문제가 없다는 보장은 할 수 있다.
참조한 책 및 사이트
https://err0rcode7.github.io/backend/2021/05/11/%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%BB%A4%EB%B2%84%EB%A6%AC%EC%A7%80.html
https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%EC%BB%A4%EB%B2%84%EB%A6%AC%EC%A7%80
https://hudi.blog/code-coverage/