Java Gradle Project에서 Unit Test코드 작성하기
Test 코드 작성하기
먼저 다음과 같이 간단한 클래스를 만든다.
public class Calculator {
public int plus(int x, int y) {
return x + y;
}
}
Intellij에서는 클래스 이름(Calculator)에서 Code Generate를 실행하면 Test코드를 작성할 수 있다.
이때 Destination package는 소스 코드와 동일하게 지정해야 추후 관리하기 쉽다.
테스트 이름 명명법
given, when, then 으로 이름을 구성한다. 그러면 해당 테스트에 대한 입력, 실행, 출력을 쉽게 파악할 수 있다.
그리고 테스트 코드도 given, when, then의 영역으로 나누어 구성한다. given에서는 입력 데이터, 객체들, 목(mock)을 준비하고, When에서는 실행될 함수들을 기술한다. 그리고 Then에서는 assertion을 사용하여 출력값과 기대값을 확인한다.
테스트는 반드시 기대값과 실제값을 확인해야 한다. 이를 위해 Assertion.assertEquals와 같은 함수를 사용한다. 다음은 이와 같은 규칙에 의해 작성한 테스트 코드다.
class CalculatorTest {
@Test
void givenTwoIntegers_whenPlus_thenReturnSum() {
// given
Calculator calculator = new Calculator();
int inputX = 1;
int inputY = 2;
// when
int actual = calculator.plus(inputX, inputY);
int expected = 3;
// then
assertEquals(expected, actual);
}
}
테스트 코드 작성 요령
1. 하나의 테스트에서는 하나의 동작만을 테스트한다.
어디서 문제가 발생했는지 알기 쉽고, 해당 테스트의 목적을 이해하기 쉽다.
2. 외부 서비스 Mock하기
외부 서비스와 연동되는 경우에는 Mockito, EasyMock, JMockit과 같은 프레임워크를 사용하여 외부 서비스를 직접 호출하지 않고도 입력/출력 데이터를 지정하여 테스트 코드를 작성할 수 있다.
3. 80% 커버리지
커버리지는 높을 수록 좋지만 100%를 추구하는 것이 언제나 적합하지는 않을 수 있다. JaCoCo나 Cobertura와 같은 코드 커버리지 레포트 도구를 사용하여 80% 이상을 목표로 삼는 것이 일반적으로 적합하다.
4. TDD
Test-Driven Development는 기능 개발 전에 테스트 코드부터 작성하는 개발 방법론이다. 일견 상식을 뒤집는 개발 방법론 같지만 테스트 코드부터 작성하는 것이 가져다주는 혜택은 곱씹어 볼만하다. 그 첫 번째 혜택은 개발을 시작하기 전에 올바른 입출력 패턴을 먼저 생각하게 해준다는 점이다. 막연하게 구현부터 하다가 예상치 못한 입출력 패턴을 뒤늦게 깨닫게 되어 버그를 만들거나 다시 작성하는 사태를 미연에 방지해 준다. 두 번째 혜택은 테스트하기 쉬운 코드를 작성하게 해준다는 점이다. 구현을 다 마치고 나서 테스트를 작성하려고 하면 크게 수정해야 할 수도 있는데 TDD는 이를 사전에 방지하는 개발 방법론인 것이다. 그리고 테스트하기 쉬운 코드란 곧 가독성이 좋은 코드라고도 볼 수 있다. 테스트 코드를 작성하기 위해서는 메서드 단위로 입출력 관계가 명확해야 하기 때문이다.
코드테스트 코드가 충실히 갖춰져 있다면 나중에 기능 수정을 하거나 리팩토링을 할 때도 안심하고 수정할 수 있어 개발 생산성이 증대된다.
5. 자동화
유닛 테스트의 실행은 CI-CD를 통해 자동화되어야 한다. 어떠한 수정 사항이 기존 기능에 문제를 불러일으키지는 않는지를 사람의 논리로는 일일이 다 헤아릴 수가 없다. 자동화된 검증이 필요하다.
댓글
댓글 쓰기