공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
지난 시간에 테스트 컨테이너를 활용하여 통합 테스트 환경을 구성했다. 이번 시간에는 이 통합 테스트 환경을 바탕으로 실제 테스트 케이스를 작성하고, 이를 통해 코드가 예상대로 동작하는지 검증한다.
1. PharmacyRepository 테스트 케이스 작성
통합 테스트 환경을 사용하여 PharmacyRepository의 save 메서드를 테스트하는 코드를 작성한다. 이 테스트는 Repository가 정상적으로 작동하는지 확인하기 위한 것이다.
package com.example.phamnav.pharmacy.repository
import com.example.phamnav.AbstractIntegrationContainerBaseTest
import com.example.phamnav.pharmacy.entity.Pharmacy
import org.springframework.beans.factory.annotation.Autowired
class PharmacyRepositoryTest extends AbstractIntegrationContainerBaseTest {
@Autowired
private PharmacyRepository pharmacyRepository
def setup() {
pharmacyRepository.deleteAll()
}
def "PharmacyRepository save"() {
given:
String address = "서울 특별시 성북구 종암동"
String name = "은혜 약국"
double latitude = 37.59
double longitude = 127.03
def pharmacy = Pharmacy.builder()
.pharmacyAddress(address)
.pharmacyName(name)
.latitude(latitude)
.longitude(longitude)
.build()
when:
def result = pharmacyRepository.save(pharmacy)
then:
result.getPharmacyAddress() == address
result.getPharmacyName() == name
result.getLatitude() == latitude
result.getLongitude() == longitude
}
//추가된 메서드
def "PharmacyRepository saveAll"() {
given:
String address = "서울 특별시 성북구 종암동"
String name = "은혜 약국"
double latitude = 37.59
double longitude = 127.03
def pharmacy = Pharmacy.builder()
.pharmacyAddress(address)
.pharmacyName(name)
.latitude(latitude)
.longitude(longitude)
.build()
when:
pharmacyRepository.saveAll(Arrays.asList(pharmacy))
def result = pharmacyRepository.findAll()
then:
result.size() == 1
}
}
- save()
- 이 메서드는 개별 약국 정보를 데이터베이스에 저장하는 save 메서드의 동작을 검증한다.
- saveAll()
- 이 메서드는 여러 개의 약국 정보를 한 번에 저장하는 saveAll 메서드의 동작을 검증한다.
이 테스트는 saveAll 메서드가 리스트로 전달된 객체들을 올바르게 저장하고, 이를 다시 조회할 수 있는지를 확인한다.
테스트 메서드 실행 시 고려사항
위 코드에서는 각각의 테스트 메서드가 실행되기 전에 setup 메서드에서 데이터베이스를 정리한다. 이는 싱글톤 컨테이너를 사용하기 때문에 첫 번째 메서드에서 남은 데이터가 다음 테스트 메서드에 영향을 미치는 것을 방지하기 위함이다. 따라서 매번 DB를 정리해 주는 것이 중요하다.
2. Docker 컨테이너 상태 확인
테스트 컨테이너를 사용하여 통합 테스트를 수행할 때는 Docker가 실행 중이어야 한다. 테스트를 실행할 때, Redis와 MariaDB 컨테이너가 자동으로 실행되고, 테스트가 종료되면 이 컨테이너들도 함께 종료된다. 또한 testcontainers/ryuk:0.7.0 컨테이너가 생성되는데, 이 컨테이너는 테스트가 종료된 후 관련 리소스를 정리하는 역할을 담당한다.
다음은 Docker 컨테이너 상태를 docker ps 명령어로 확인한 결과이다.
실행 전
- 실행 전에는 Redis와 MariaDB 컨테이너만 실행 중이다.
실행 중
- 테스트가 진행 중일 때는 Redis와 MariaDB 컨테이너 외에도 testcontainers/ryuk:0.7.0 컨테이너가 추가로 실행된다. 이 컨테이너는 테스트 리소스를 관리하기 위한 용도로 사용된다.
종료 후
- 테스트가 종료된 후에는 모든 컨테이너가 정상적으로 종료된 것을 확인할 수 있다.
3. Kakao API 응답 DTO 수정
테스트를 진행하다 보니 KakaoApiResponseDto에서 누락된 @JsonProperty 어노테이션을 추가해야 한다는 것을 발견했다. 이를 추가하여 JSON 응답을 올바르게 매핑할 수 있도록 수정한다.
package com.example.phamnav.api.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class KakaoApiResponseDto {
@JsonProperty("meta")
private MetaDto metaDto;
@JsonProperty("documents")
private List<DocumentDto> documentList;
}
- 이렇게 수정하면 Kakao API로부터 받은 응답이 KakaoApiResponseDto 객체에 올바르게 매핑된다.
4. KakaoAddressSearchService 테스트 케이스 작성
이제 통합 테스트 환경을 바탕으로 KakaoAddressSearchService의 테스트 케이스를 작성해 보자. 이 테스트는 주소 값이 null이거나 유효한 값일 때, 서비스가 어떻게 동작하는지 확인하는 것이다.
package com.example.phamnav.api.service
import com.example.phamnav.AbstractIntegrationContainerBaseTest
import com.example.phamnav.api.dto.KakaoApiResponseDto
import org.springframework.beans.factory.annotation.Autowired
class KakaoAddressSearchServiceTest extends AbstractIntegrationContainerBaseTest {
@Autowired
private KakaoAddressSearchService kakaoAddressSearchService
def "address 파라미터 값이 null이면, requestAdderessSearch 메소드는 null을 리턴한다."() {
given:
String address = null
when:
def result = kakaoAddressSearchService.requestAddressSearch(address)
then:
result == null
}
def "주소값이 valid하다면, requestAddressSearch 메소드는 정상적으로 document를 반환한다."() {
given:
def address = "서울 성북구 종암로 10길"
when:
def result = kakaoAddressSearchService.requestAddressSearch(address)
then:
result.documentList.size() > 0
result.metaDto.totalCount > 0
result.documentList.get(0).addressName != null
}
}
null 값에 대한 처리
- 주소 값이 null일 때 requestAddressSearch 메서드가 올바르게 동작하는지 확인한다.
유효한 주소 값에 대한 처리
- 유효한 주소 값이 전달되었을 때, requestAddressSearch 메서드가 정상적으로 동작하는지 확인한다.
이 테스트는 requestAddressSearch 메서드가 실제로 API 호출을 통해 데이터를 받아오고, 이를 올바르게 처리하는지 검증한다.
이번 장에서는 통합 테스트 환경을 활용해 PharmacyRepository와 KakaoAddressSearchService의 테스트 케이스를 작성해 보았다. Docker를 활용해 환경을 구성하고, 테스트 실행 후 리소스를 정리하는 과정을 통해 보다 견고한 테스트 환경을 구축할 수 있었다.
'BackEnd > Project' 카테고리의 다른 글
[PharmNav] Ch05. JPA Dirty Checking (0) | 2024.09.03 |
---|---|
[PharmNav] Ch05. Spring Data JPA 및 영속성 컨텍스트 (1) | 2024.09.02 |
[PharmNav] Ch05. Testcontainers (0) | 2024.09.02 |
[PharmNav] Ch05. 테스트 케이스 Spock 프레임워크 (3) | 2024.09.02 |
[PharmNav] Ch05. kakao 주소검색 api 구현 (2) | 2024.09.02 |