Posts [Spring] @SpringBootTest vs @DataJpaTest
Post
Cancel

[Spring] @SpringBootTest vs @DataJpaTest

@SpringBootTest

  • ApplicationContext에 모든 Bean들을 등록한다.
  • SpringBoot 어플리케이션을 실행했을 때와 동일하게 컨테이너에 Bean들을 등록한다.
1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
class UserServiceIntegrationTest {

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    ...
}


@DataJpaTest

  • ApplicationContext에 JPA에 필요한 설정들만 등록한다.
  • 기본적으로 in-memory embedded DB(ex. H2)를 사용한다.
  • Component Scan을 하지 않아 컨테이너에 @Component 빈들이 등록되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@DataJpaTest
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
class UserServiceIntegrationTest {

    // @Service(@Component) 어노테이션이 붙어 있는 클래스
    // 따라서, @DataJpaTest에서 @Autowired 할 수 X
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    @BeforeEach
    void setUp() {
        userService = new UserService(userRepository);
    }

    ...
}


Comparison

  • @SpringBootTest는 @Component 어노테이션이 붙은 클래스를 사용해야 하는 경우에 활용하자.
  • @DataJpaTest는 위의 경우가 아닐 때 고려해보자. 👉 ApplicationContext에 @Component 빈들을 등록하지 않아 테스트 실행 속도가 빨라진다.


Performance

실제로 약 10개의 테스트 코드로 성능 테스트를 해봤는데,

  • @SpringBootTest는 12sec 447ms
  • @DataJpaTest는 823ms

테스트 실행 속도에 약 11초 정도의 차이가 있었다.


References

This post is licensed under CC BY 4.0 by the author.