-
Testcntainers 소개 및 설치백기선(인프런 강의)/더 자바, 애플리케이션을 테스트하는 다양한 방법 2020. 6. 5. 08:54반응형
https://www.testcontainers.org/
Testcontainer란?
- 테스트에서 도커 컨테이너를 실행할 수 있는 라이브러리.
- 테스트 실행시 DB를 설정하거나 별도의 프로그램 또는 스크립트를 실행할 필요 없다.
- 보다 Production에 가까운 테스트를 만들 수 있다.
- 테스트가 느려진다.
Testcontainer 설치 및 예시
Testcontainers JUnit5 지원 모듈 설치(기본) - Testcontainers와 Container 사용가능
<dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <version>1.13.0</version> <scope>test</scope> </dependency>
@Testcontainers
- JUnit 5 확장팩으로 테스트 클래스에 @Container를 사용한 필드를 찾아서 컨테이너 라이프사이클 관련 메소드를 실행해준다.
@Container
- 인스턴스 필드에 사용하면 모든 테스트 마다 컨테이너를 재시작 하고, 스태틱 필드에 사용하면 클래스 내부 모든 테스트에서 동일한 컨테이너를 재사용한다.
설정방법
여러가지 모듈을 제공하는데, 각 모듈을 별도로 설치를 해야 함. 그래야지 컨테이너를 띄울 수 있음
이번 강의에서는 Postgresql 모듈을 사용함(현 직장 주력 DB라 눈에 익어 기분좋음)
- https://www.testcontainers.org/modules/databases/
- https://www.testcontainers.org/modules/databases/postgres/
postgresql에 대한 의존성 추가
<dependency> <groupId>org.testcontainers</groupId> <artifactId>postgresql</artifactId> <version>1.13.0</version> <scope>test</scope> </dependency>
application-test.properties 설정
아래와 같이 설정을 하게 되면 testcontainer를 사용할 수 있다.
spring.datasource.url=jdbc:tc:postgresql:///studytest spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
import me.whiteship.inflearnthejavatest.domain.Member; import me.whiteship.inflearnthejavatest.domain.Study; import me.whiteship.inflearnthejavatest.member.MemberService; import org.junit.After; import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.times; @SpringBootTest @ExtendWith(MockitoExtension.class) @ActiveProfiles("test") @Testcontainers class StudyServiceTest { @Mock MemberService memberService; @Autowired StudyRepository studyRepository; @Container //아래와같이 DB이름 설정 가능 static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer() .withDatabaseName("postgres"); @BeforeAll static void beforeAll() { postgreSQLContainer.start(); } @AfterAll static void afterAll() { postgreSQLContainer.stop(); } @BeforeEach void beforeEach() { studyRepository.deleteAll(); } @Test void createNewStudy() { // Given StudyService studyService = new StudyService(memberService, studyRepository); assertNotNull(studyService); Member member = new Member(); member.setId(1L); member.setEmail("rlawls1991@email.com"); Study study = new Study(10, "테스트"); given(memberService.findById(1L)).willReturn(Optional.of(member)); // When studyService.createNewStudy(1L, study); // Then assertEquals(1L, study.getOwnerId()); then(memberService).should(times(1)).notify(study); then(memberService).shouldHaveNoMoreInteractions(); } @DisplayName("다른 사용자가 볼 수 있도록 스터디를 공개한다.") @Test void openStudy() { // Given StudyService studyService = new StudyService(memberService, studyRepository); Study study = new Study(10, "더 자바, 테스트"); assertNull(study.getOpenedDateTime()); // When studyService.openStudy(study); // Then assertEquals(StudyStatus.OPENED, study.getStatus()); assertNotNull(study.getOpenedDateTime()); then(memberService).should().notify(study); } }
반응형'백기선(인프런 강의) > 더 자바, 애플리케이션을 테스트하는 다양한 방법' 카테고리의 다른 글
Testcontainers, 컨테이너 정보를 스프링 테스트에서 참조하기 (0) 2020.06.07 Testcontainers 기능 (0) 2020.06.07 BDD 스타일 Mockito API (0) 2020.06.02 Mock 객체 확인 (0) 2020.05.29 Mock객체 stubbing연습문제 (0) 2020.05.28