개발자들은 언제나 기능을 구현 후에 대해서도 생각을 하여야한다고 생각한다. exception과 같이 개발자가 예측가능한 예외상황이나 예측이 불가능한 상황등 여러 상황에 대해 최대한 많은 테스트를 거쳐야 한다.
위 그래프는 개발진행도에 따른 버그발생시 비용소모를 그래프화 한것이다. 한눈에도 알수있듯 버그 발견시기가 늦어질수록 해당 버그를 수정하기위한 비용이 기하급수적으로 늘어난다.
개발자가 기능을 구현하고 있는 시점에서 모든 버그를 잡을 수 있다면 최선의 결과일테지만 현실은 그것이 불가능하단건 우리 모두가 알것이라고 생각한다. 그렇기때문에 기능 구현이 끝난 후 테스트코드를 작성하여 프로그램을 테스트하는 과정이 필수적이게 된다.
이때 우리는 Unit Test(단위 테스트)기법을 사용하여 프로그램을 작은 단위까지 쪼갠 후 각단위가 정확하게 동작하는지 검사하는 테스트부터 시작하게 된다.
자바 프로그램에서는 자바 프로그래밍 언어 용 단위 테스트 프레임워크인 JUnit5을 사용하여 단위테스트를 진행한다.
해당 프레임워크에서 지원하는 에노테이션은 아래와 같다.
@BeforeEach
: 각 테스트 코드가 실행되기전 수행되는 메서드 구현
@AfterEach
: 각 테스트 코드가 실행 된 후 수행되는 메서드 구현
@BeforeAll
: 모든 테스트 코드가 수행되기전 수행되는 메서드 구현
@AfterAll
: 모든 테스트 코드가 수행된 후 수행되는 메서드 구현
@Nested
: 주제 별로 테스트 코드를 묶어줌
@Order
: 테스트 코드의 실행 순서를 지정할 수 있음
또한 Assertons분류의 메서드를 통해 해당 결과를 비교,판정이 가능하다.
Assertions.assertEquals(expected, actual)
: 두개의 값이 같은지 판정
Assertions.assertTrue(boolean)
: 해당 boolean 값이 true인지 판정
Assertions.assertNotNull(actual)
: 해당 actual 값이 Null값인지 판정
Assertions.assertThrows(expectedType, executable)
: 예외상황시 결과 판정
이러한 테스트 코드 작성 시 대표적으로 코드를 작성하는 방법이 있는데 바로
Given - When - Then
패턴이다.
Given
When
Then
@Test
@DisplayName("계산기 연산 성공 테스트")
void test1() {
// given
int num1 = 5;
String op = "/";
int num2 = 2;
// when
Double result = calculator.operate(num1, op, num2);
// then
assertNotNull(result);
assertEquals(2.5, result);
}