테스트
- 테스트란 만들어진 코드를 확신할 수 있게 도와주는 도구이다.
- 또한 변화에 유연하게 대처할 수 있고, 개발자에게 안심을 준다.
- 좋은 테스트란?
- 테스트하고자 하는 대상이 명확하다면 그 대상을 기준으로 단위테스트를 진행하는 것이 좋다. -> 대상에 집중할 수 있다.
- 동일한 테스트는 항상 동일한 결과를 보장해야한다.
- 순서에 영향을 받지 않아야 한다.
- 좋은 습관?
- 먼저 스프링 컨테이너 없이 테스트할 수 있는 방법을 우선적으로 고려해야한다. (통합테스트 보단 단위테스트!)
- 부정적인 케이스를 먼저 만드는 습관을 가져야 한다.
픽스퍼
- 테스트를 수행하는 데 필요한 정보나 오브젝트를 픽스쳐라고 한다.
- 픽스쳐를 아래와 같이 구현할 수 있다.
@DisplayName("userDao test")
public class UserDaoTest {
private UserDao userDao;
private User user1;
private User user2;
private User user3;
@BeforeEach
public void setup() {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
this.userDao = context.getBean("userDao", UserDao.class);
this.user1 = new User("gyumee", "박성철", "springno1");
this.user2 = new User("leegw700", "이길원", "springno2");
this.user2 = new User("bumjin", "박범진", "springno3");
}
}
- 위 코드에서 setUp() 메소드에서 만드는 userDao 를 각각의 테스트 메소드에서 공유해서 사용할 수 있도록 인스턴스 변수로 선언했다.
- 또한 user1, user2, user3 또한 테스트에서 쓰일 수 있는 정보기 때문에 모두 픽스쳐라고 할 수 있다.
- 위의 코드에서 문제점은 무엇일까?
- 테스트 메소드가 실행 될 때마다 애플리케이션 컨텍스트가 만들어 지다는 것이다.
- 그렇게 되면 애플리케이션 컨텍스트를 생성할 때 내부의 모든 빈을 초기화하기 때문에 성능이슈가 발생할 수 있다.
- 또한 독자적으로 많은 리소스를 할당하거나 독립적 스레드를 사용하기 때문에, 계속 새로운 애플리케이션 컨텍스트 생성시 이슈가 발생할 수 있다.
스프링 테스트 에서 ApplicationContext 생성 방식 개선
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "/applicationContext.xml")
@DisplayName("userDao test")
public class UserDaoTest {
@Autowired
ApplicationContext applicationContext;
private UserDao userDao;
private User user1;
private User user2;
private User user3;
@BeforeEach
public void setup() {
userDao = applicationContext.getBean("userDao", UserDao.class);
this.user1 = new User("gyumee", "박성철", "springno1");
this.user2 = new User("leegw700", "이길원", "springno2");
this.user2 = new User("bumjin", "박범진", "springno3");
System.out.println(this.applicationContext);
System.out.println(this);
}
}
- Junit 프레임워크의 확장 클래스를 지정해줄 수 있다.
@ContextConfiguration(locations = "/applicationContext.xml")
여기서 지정해준 설정값에 따라 테스트가 사용할 ApplicationContext를 만들고 관리하는 작업을 진행해준다.
- 테스트가 실행하기 전에 딱 한 번만 ApplicationContext를 만들어두고, 공유해서 사용할 수 있다.
REFERENCES