모르지 않다는 것은 아는것과 다르다.

Books

테스트란 (토비의 스프링 2장)

채마스 2022. 2. 27. 01:48

테스트

  • 테스트란 만들어진 코드를 확신할 수 있게 도와주는 도구이다.
  • 또한 변화에 유연하게 대처할 수 있고, 개발자에게 안심을 준다.
  • 좋은 테스트란?
    • 테스트하고자 하는 대상이 명확하다면 그 대상을 기준으로 단위테스트를 진행하는 것이 좋다. -> 대상에 집중할 수 있다.
    • 동일한 테스트는 항상 동일한 결과를 보장해야한다.
    • 순서에 영향을 받지 않아야 한다.
  • 좋은 습관?
    • 먼저 스프링 컨테이너 없이 테스트할 수 있는 방법을 우선적으로 고려해야한다. (통합테스트 보단 단위테스트!)
    • 부정적인 케이스를 먼저 만드는 습관을 가져야 한다.



픽스퍼

  • 테스트를 수행하는 데 필요한 정보나 오브젝트를 픽스쳐라고 한다.
  • 픽스쳐를 아래와 같이 구현할 수 있다.
@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

  • 이일민님의 토비의 스프링 2장