⏰ 2024. 06. 20 목
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
테스트 - 테스트 코드
테스트 코드를 작성하여 프로그램의 버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방지할 수 있다.
버그가 발견되는 시점이 늦어질수록 해결하기 위한 비용이 기하급수적으로 커진다.
작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법이다.
하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트할 수 있다.
단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘못되었는지를 빠르고 정확하게 확인할 수 있다는 장점이 있다.
하나의 모듈이나 클래스에 대한 테스트이기 때문에 모듈 간의 상호 작용은 검증할 수 없다.
여러 개의 단위 테스트를 하나의 통합된 테스트로 검사하는 테스트 기법이다.
두 개 이상의 모듈이 연결된 상태를 테스트할 수 있다.
모듈 간의 연결에서 발생하는 문제를 검증이 가능하다.
단위 테스트 시에는 Spring은 동작하지 않고, 통합 테스트 시에는 @SpringBootTest
를 통해 스프링을 동작시킬 수 있다.
@SpringBootTest
: 스프링이 동작되도록 해주는 애너테이션
통합 테스트 수행 시 스프링이 동작하기 때문에 Spring IoC/DI 기능을 사용할 수 있고, Repository를 사용해 DB CRUD가 가능하다.
@BeforeEach
: 각각의 테스트 코드가 실행되지 전에 수행되는 메서드를 만든다.
@AfterEach
: 각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만든다.
@BeforeAll
: 모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드를 만들고, 이 메서드는 항상 static 이여야 한다.
@AfterAll
: 모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드를 만들고, 이 메서드는 항상 static 이여야 한다.
@DisplayName
: 테스트의 내용을 한 눈에 알아볼 수 있게 네이밍할 수 있어 테스트의 수행 내용들을 빠르게 파악할 수 있다.
@Nested
: 주제 별로 테스트를 그룹화한다. Class 안에서 Class로 여러 메서드를 묶는다.
@Order
: 테스트를 메서드 단위로 순서를 지정하고 싶을 때, @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
애너테이션을 테스트 클래스 위에 설정한다. 이후 원하는 메서드에 @Order(n)
을 추가하고 n
위치에 원하는 순서를 입력한다.
@RepeatedTest
: 위 애너테이션을 사용하여 테스트 메서드를 반복할 수 있고, name
옵션을 사용하여 네이밍할 수 있다. RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값을 확인할 수 있다.
@ParameterizedTest
: 파라미터를 받아 테스트할 수 있는 메서드를 만들 수 있고,
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
를 사용하여 파라미터 값을 전달 할 수 있습니다. 전달되는 파라미터 수 만큼 테스트 메서드가 수행된다. int, String 등 여러 타입의 파라미터를 전달할 수 있다.
Assertions.assertEquals(expected, actual)
: 첫 번째 파라미터에 예상 값을 넣고, 두 번째 파라미터에 테스트 결과 값을 넣는다. 예상 값과 결과 값이 다르면 실패한다. 세 번째 파라미터 값에 람다식으로 메세지를 넣으면 실패 시 해당 메세지가 출력된다.
Assertions.assertTrue(boolean)
: 해당 파라미터의 값이 true인지 확인한다.
Assertions.assertNotNull(actual)
: 해당 파라미터 값이 null이 아님을 확인한다.
Assertions.assertThrows(expectedType, executable)
: 첫 번째 파라미터에 예상하는 Exception 클래스 타입을 넣고 두 번째 파라미터에 실행 코드를 넣는다. 실행 코드의 결과가 예상한 해당 클래스 타입이라면 테스트에 성공한다.
테스트 코드의 스타일을 표현하는 방식이다.
Given
: 테스트하고자 하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언한다.
When
: 테스트 하고자 하는 대상을 실제로 실행한다.Then
: 어떤 특정한 행동으로 인하여 발생할 것으로 예상되는 결과에 대해 예측하고 맞는지 확인한다.