테스트 커버리지
테스트 커버리지란 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타낸 정도이다. 수행한 테스트가 얼마나 테스트 대상을 커버 했는지 나타낸다.
코드 커버리지 기준
1. 라인 커버리지 (Line Coverage)
코드가 한줄이 한번 이상 실행이 충족이 되어야 됩니다.
public class Main {
public static void foo(int a) {
System.out.println("--function starts--"); // 1번
if (a > 0) { // 2번
a /= 2; // 3번
}
System.out.println("--function ends--"); // 4번
}
public static void main(String[] args) {
foo(10); // 예시 호출
}
}
이 경우 foo(10)을 호출하면 1번, 2번, 3번, 4번 라인이 실행됩니다. 따라서 이 테스트는 100% 라인 커버리지를 달성합니다.
만약 foo(-1)을 호출했다면 1번, 2번, 4번 라인만 실행되며, 3번은 실행되지 않아 라인 커버리지는 75%가 됩니다.
2. 조건 커버리지 (Condition Coverage)
조건식으로 각 개별 조건이 참과 거짓이 모두 테스트를 측정합니다.
public class Main {
public static void foo(int a, int b) {
if (a > 0 && b > 0) { // 1번
System.out.println("Both are positive"); // 2번
}
}
public static void main(String[] args) {
foo(10, 5); // 테스트 1
foo(-1, 5); // 테스트 2
foo(10, -5); // 테스트 3
}
}
회사에선 대부분 라인 커버리지 를 사용하는거 같다.
spring 에서 테스트 커버리지에 대한걸 확인 할수도 있고, 커버리지를 확인할수 있는 도구들도 있습니다 대표적으로 sonarqube가 있습니다. 필자의 경험상 CI 툴에 적용도 가능하고, 다양하게 적용이 가능합니다.
단순하게 테스트 커버리지는 테스트가 되지 않은 부분만 알려줄뿐인 도구이다. 테스트 커버리지가 높다고 서비스 품질 코드 품질이 높은게 아니다.
이전 회사에서 테스트 커버리지를 높이려고 서비스에 집중 하지 않고, 커버리지에 높이는곳에 리소스를 사용하는걸 봤다. 개인적인 생각엔 커버리지를 높이려고 할땐, 그 많큼 테스트 코드가 짜기 싫고 어렵다고 판단할수 있는 개발자가 생겨서 결국 테스트코드의 협업도가 낮아질수도 있을꺼 같다.
정말 테스트가 중요한 부분은 해당 비즈니스 도메인이 잘 동작 하는지에 중점을 맞춰서 테스트 하는 방법이다.
테스트 도중 해당 코드를 변경 해야만 한다면 비즈니스 코드는 잘못 작성되었다고 판단한다. 그래서 선행으로 TDD라는 개념이 나온걸로 알고 있다.
소프트웨어에 공통적으로 적용할 수 있는 "이상적인" 커버리지 수치라는 것은 없다. 구글에서는 커버리지 수치가 60%면 용인되는 수준, 75%이면 칭찬할만한 수준, 90%면 모범적인 수준으로 보고있지만 전사적으로 강제하는 기준은 아니며 비즈니스 요구에 맞춰 얼마를 달성할 것인지 정하도록 격려한다고 한다.
'Java' 카테고리의 다른 글
| 상속보다 컴포지션(조합)을 사용하라 (0) | 2024.10.17 |
|---|---|
| 오버라이딩의 응용 (0) | 2024.10.16 |
| 자바 default 접근 제어자 (0) | 2024.10.16 |
| 컴파일 타임과 런타임의 차이 (0) | 2024.10.10 |
| 자바 변수 네이밍 컨벤션 (1) | 2024.10.10 |