ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Testcntainers 소개 및 설치
    백기선(인프런 강의)/더 자바, 애플리케이션을 테스트하는 다양한 방법 2020. 6. 5. 08:54
    반응형

    https://www.testcontainers.org/

     

    Testcontainer란?

    • 테스트에서 도커 컨테이너를 실행할 수 있는 라이브러리.
    • 테스트 실행시 DB를 설정하거나 별도의 프로그램 또는 스크립트를 실행할 필요 없다.
    • 보다 Production에 가까운 테스트를 만들 수 있다.
    • 테스트가 느려진다.

     

     

    Testcontainer 설치 및 예시

    Testcontainers JUnit5 지원 모듈 설치(기본) - TestcontainersContainer 사용가능

    <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라 눈에 익어 기분좋음)

    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);
        }
    
    }
    반응형
Designed by Tistory.