최근 나의 버려진 프로젝트인 헬창닷컴..(http://www.helchang.com)) 이 프로젝트는 내가 위메프에 입사하게 해준? 고마운 프로젝트인데, 회사 입사 이후에는
매우 바쁜관계 및 GCP의 과금문제로 버려둔 상태로 있던 프로젝트이다.
이 프로젝트를 살리고, 최근 배우고있는 기술들을 적용하자는 의미에서 이 프로젝트를 다시 살려보고자 최근에 노력하고 있다.
그 첫 단추로 라즈베리 파이에 Jenkins를 설치하여 이 프로젝트에 CD(Continuous Deploy)를 구성하였다.
https://honeyinfo7.tistory.com/304
그리고 이제, 이 프로젝트를 살리고자 Maven으로 설정되어있던 설정을 Gradle로 Converting하고 소스코드를 하나하나 복기(?)하는 과정을 거치고 있다.
복기하는 김에, 테스트코드를 작성중인데 최근 사용하고 있는, testcontainer를 사용하여 Database 테스트를 해보고자 한다.
build.gradle
testImplementation 'org.testcontainers:mysql:1.15.3'
testImplementation "org.testcontainers:junit-jupiter:1.15.3"
UserRoleRepositoryTest.java
@Sql("/init_table.sql")
@Sql("/user_role_repository.sql")
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserRoleRepositoryTest
{
@Autowired
UserRoleRepository userRoleRepository;
@Test
public void findByAppUser_2Role_HasTwoRole()
{
// user_role_repository.sql 파일에 2개의 role이 포함되어 있다.
User user = User.builder().id("jabel123").email("jabel123@naver.com").build();
List<UserRole> roleList = userRoleRepository.findByAppUser(user);
assertThat(roleList.size()).isEqualTo(2);
}
}
- @Sql : 테스트코드 실행되기 전에 이 어노테이션에 입력된 .sql파일을 실행할 수 있게 해준다
- @DataJpaTest : JPA 관련 테스트 설정만 로드한다. DataSource의 설정이 정상적인지, JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지 등의 테스트가 가능하다. (내장DB를 사용한다고 한다.)
- @AutoConfigureTestDatabase(replace = [설정값]) :
- Replace.Any : 기본적으로 내장된 Embedded 데이터베이스를 사용한다.
- Replace.NONO : 설정한 프로퍼티에 따라 데이터소스가 적용된다.(none을 사용하여 docker MySQL을 사용한다.)
application.yml
spring:
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:mysql:8:///
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
대략 중요한 파일은 위의 세개와 같다.
수행결과 docker에서 MySQL을 실행시키는 과정이 꽤 길었다. 가장 궁금한 사항은 여러개의 테스트를 띄울 경우 도커에서 MySQL을 여러번 실행시키는지에 대한 여부였다.
확인결과, 여러개의 테스트가 실행되더라도 도커에서 mysql을 띄우는 작업은 딱 한번 수행되는것을 확인할 수 있었다.