말머리를 JUnit으로 할까 고민했다. 테스트라고 적으면 테스트 게시글처럼 보일까봐...
그런데 딱히 JUnit에만 한정된 내용이 아니어서 그냥 테스트라고 했다.
토비의 스프링 3.1에서 2장 테스트를 공부하는 중이다. 사실 어디에서나 테스트 중요도가 매우 높다고 말하고 있다. 나도 머릿속으로 이해는 하지만 빠르게 기능을 구현하고 싶어서 소홀해지는 것이 현실이다... 그래서 이번에 테스트에 대해서 공부하는 김에 사고방식의 전환이 이루어졌으면 좋겠다.
공부를 하면서 중요하다고 생각하는 내용들을 정리해 보았다.
단위 테스트(Unit Test)란?
개발자가 작성한 하나의 기능을 가진 코드들을 테스트하는 것을 의미한다.
좋은 단위 테스트의 조건
각 단위 테스트는 독립적이어야 한다.
코드를 수정하지 않았다면 매번 같은 결과를 반환해야 한다.
각 테스트는 순서에 상관없이 성공해야 한다.
외부의 요인에 의해 테스트 결과가 달라져서는 안 된다.
통과할만한 케이스가 아닌 통과하지 못할 것 같은 케이스 위주로 사용하자.
하나의 기능을 구현하였을 때 최대한 빠르게 해당 기능을 테스트 해보는 것이 좋다.
ㄴ 한번에 여러 기능을 구현해놓고 한꺼번에 테스트하는 것은 좋지 않다는 것!
테스트 주도 개발(Test Driven Development)
만들고자하는 기능을 바로 구현하는 것이 아니라 해당 기능에 대한 테스트를 먼저 만들어 테스트를 통과할만한 코드를 작성하는 방식이다.
픽스처 (Fixture)
픽스처란 테스트 수행 시에 필요한 정보와 오브젝트를 의미한다.
테스트 메서드 인스턴스 생성
테스트 클래스 내의 각 테스트 메서드는 각각 다른 인스턴스가 생성되어 사용된다.
@Slf4j
@SpringBootTest
public class ApplicationContextTest {
@Autowired
private ApplicationContext applicationContext;
@Test
void test1() {
log.info("ApplicationContext = {}", applicationContext);
log.info("this = {}", this);
}
@Test
void test2() {
log.info("ApplicationContext = {}", applicationContext);
log.info("this = {}", this);
}
}
위와 같이 test1()과 test2()라는 메서드가 있을 때, 각 메서드를 실행하기 위해서 ApplicationContextTest 인스턴스를 매번 생성한다는 것이다. 이는 각 테스트마다의 독립성을 확실하게 하기 위함이라고 한다. 위의 코드를 실행해보면

이런 결과를 확인할 수 있다. applicationContext는 스프링에서 생성하고 관리하는 인스턴스를 주입받았기 때문에 동일한 인스턴스인 것을 알 수 있고, 테스트를 위한 인스턴스는 다른 것을 알 수 있다.
학습 테스트
테스트는 작성한 코드가 잘 작동하는지 확인하는 용도로 자주 사용하기는 하지만 단순 학습을 위해 사용할 수도 있다. 예를 들어 프레임워크의 어느 기능을 직접 테스트 해보며 생각했던대로 작동하는지 확인하는 것이다. 하지만 이때에는 프레임워크의 기능들을 검증하는 것이 아닌 자신이 무엇을 알고 있는지, 제대로 알고 있는지 확인하는 목적이다.
@Slf4j
@SpringBootTest
public class ApplicationContextTest {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private DataSource dataSource1;
@Test
@DisplayName("데이터소스 비교")
void dataSourceSameTest() {
DataSource dataSource2 = (DataSource)applicationContext.getBean("dataSource");
Assertions.assertThat(dataSource1).isSameAs(dataSource2); // 동일성 비교
log.info("dataSource1 = {}", dataSource1);
log.info("dataSource2 = {}", dataSource2);
}
}
책에서 추천해본대로 과연 스프링부트에서 application.properties를 읽고 자동으로 Bean으로 등록해준 DataSource와 마찬가지로 자동 등록된 ApplicationContext에서 가져온 DataSource가 과연 동일한 인스턴스인지 확인해 보았다.


확인해보니 같은 인스턴스임을 알 수 있었다.
버그 테스트
버그 테스트란 코드의 오류를 잘 드러내줄 수 있는 테스트를 말한다.
'공부 > 기타' 카테고리의 다른 글
| [Redis] Spring Data Redis 사용하기 (0) | 2024.05.21 |
|---|---|
| MapStruct는 Lombok보다 먼저 작성하자 (0) | 2024.04.29 |
| Apache Kafka 실행 및 기본 기능 테스트하기 (0) | 2024.04.03 |
| SOLID에 대해서 알아보자 (0) | 2024.02.12 |
| 정규 표현식(Regular expression) (0) | 2023.08.29 |