코드 커버리지
코드 커버리지란 화이트 박스 테스트의 일종으로 Code Coverage 말 그대로 ‘코드를 얼마나 커버하고 있느냐’를 수치로 나타낸 것이다.
정확한 정의는 소프트웨어 테스트에서 테스트된 코드의 비율이다.
만약 내가 작성한 메서드의 테스트 코드가 작성되어 있다면 코드 커버리지가 상승하는 것이다.
그리고 코드 커버리지가 높을수록, 테스트 코드가 프로덕션 코드 전반을 잘 검사하고 있다는 의미이다.
현업에서는 보통 75~80% 이상의 코드 커버리지를 목표로 설정하는 경우가 많다. 이는 코드의 신뢰성과 안정성을 위해서이다.
다만, 100% 코드 커버리지가 반드시 완벽한 테스트를 의미하지는 않는다. 테스트의 품질과 효율성 또한 중요하다.
코드 커버리지 측정 기준
라인 커버리지
실행된 코드 라인의 비율을 측정한다.
public int add(int a, int b) {
int sum = a + b; // 라인 1
return sum; // 라인 2
}
@Test
public void addInteger() {
assertEquals(5, add(2, 3));
}
문장 커버리지
내부에 있는 각 명령문이 실행되었는지 확인한다.
public int multiply(int a, int b) {
if (a == 0 || b == 0) { // 문장 1
return 0; // 문장 2
}
return a * b; // 문장 3
}
@Test
public void multiplyInteger() {
assertEquals(0, multiply(0, 5)); // 실행: 문장 1, 2
assertEquals(10, multiply(2, 5)); // 실행: 문장 1, 3
}
분기 커버리지
주요 조건문에 해당하는 모든 경우의 수가 실행되었는지 확인한다.
public String checkNumber(int n) {
if (n > 0) { // 분기 1
return "Positive"; // 분기 2
} else if (n < 0) { // 분기 3
return "Negative"; // 분기 4
} else {
return "Zero"; // 분기 5
}
}
@Test
public void testCheckNumber() {
assertEquals("Positive", checkNumber(5)); // 실행: 분기 1, 2
assertEquals("Negative", checkNumber(-3)); // 실행: 분기 3, 4
assertEquals("Zero", checkNumber(0)); // 실행: 분기 5
}
조건 커버리지
조건의 참・거짓의 가능한 경우의 수 모두 확인하는 방법이다.
public boolean isAudlt(int age, boolean hasPermission) {
return age >= 18 && hasPermission; // 조건 1: (age >= 18), 조건 2: (hasPermission)
}
@Test
public void isAudltTestWithAgeAndPermission() {
assertFalse(isAudlt(17, true)); // 조건 1: 거짓, 조건 2: 참
assertFalse(isAudlt(18, false)); // 조건 1: 참, 조건 2: 거짓
assertTrue(isAudlt(18, true)); // 조건 1: 참, 조건 2: 참
}
메서드 커버리지
메서드가 실행되었는지 아닌지 확인한다.
public int add(int a, int b) { // 메서드 1
return a + b;
}
public int subtract(int a, int b) { // 메서드 2
return a - b;
}
@Test
public void testAdd() {
assertEquals(5, add(2, 3)); // 메서드 1 실행
}
@Test
public void testSubtract() {
assertEquals(1, subtract(3, 2)); // 메서드 2 실행
}
클래스 커버리지
클래스 내부에서 선언된 메서드가 모두 실행되었는지 확인한다.
public class Calculator {
public int add(int a, int b) { return a + b; } // 메서드 1
public int subtract(int a, int b) { return a - b; } // 메서드 2
private int multiply(int a, int b) { return a * b; } // 메서드 3
}
@Test
public void testCalculator() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3)); // 메서드 1 실행
assertEquals(1, calc.subtract(3, 2)); // 메서드 2 실행
assertEquals(1, calc.multiply(3, 2)); // 메서드 3 실행
}
이 중에서 가장 대중적으로 사용되는 기법은 라인 커버리지라고 한다.
그 이유는 작성된 테스트 코드가 실제 프로덕트 코드의 몇 퍼센트를 실행했는지 쉽고 직관적으로 볼 수 있기 때문이다.
다음 글에선 SonarQube를 사용해 코드 커버리지를 측정합시다.
'백엔드' 카테고리의 다른 글
[DB] MySQL 테이블 복구 (Feat : 바이너리 로그) (0) | 2025.01.20 |
---|