테스트 코드의 중요성
기능에 대한 불확실성 감소, 기능을 안전하게 보호
ex) A 기능을 추가 개발하여 오픈했는데, 기존 B 기능이 문제가 발생
개발 초기에 문제 발견에 도움을 줌 -> 개발 시간 단축
ex) 배포후 문제 발생 -> 원인파악 -> 다시 테스트 -> 코드수정 = 야근
Spock
- Groovy 언어를 이용하여 테스트 코드를 작성할 수 있는 프레임워크
- Junit 보다 간결한 코드 - 주석으로 블록을 구분하고 메소드 이름 또한 제약사항이 많이 존재
- given, when, then 코드 블록을 명확히 구분 -> 가독성이 좋다
- 메소드명을 문자열로 선언 가능하다
Spock 작성 순서
테스트 클래스는 Groovy 클래스로 생성, Specification 클래스를 상속 받는다.
feature(테스트메서드)는 def를 이용하여 함수로 선언하며, 하나 이상의 블록이 존재해야함
- given : 테스트에 필요한 값 준비
- when : 테스트할 코드를 실행
- then : when과 함께 사용하며 예외 및 결과 값을 검증
- expect : then과 같으며 when을 필요로 하지 않기 때문에 간단한 테스트 및 where와 같이 사용된다.
- where : 데이터가 다르고 로직이 동일한 경우 동일한 테스트에 대한 중복 코드 제거 가능 (특히 유용!)
- | 로 구분한 data table 로 생성이 가능하며 파라미터, 결과값을 보기 좋게 구분 가능
build.gradle
groovy 플러그인 추가
spock 의존성 추가
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.6'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'groovy'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// spock
testImplementation('org.spockframework:spock-core:2.1-groovy-3.0')
testImplementation('org.spockframework:spock-spring:2.1-groovy-3.0')
// 런타임에 클래스 기반 spock mock을 만들기 위해서 필요
testImplementation('net.bytebuddy:byte-buddy:1.12.10')
}
src > test > groovy 경로를 만들고 테스트 코드를 작성한다
Ctrl+shift+T - 테스트 코드 생성 단축키
class KakaoUriBuilderServiceTest extends Specification {
private KakaoUriBuilderService kakaoUriBuilderService
def setup() {
kakaoUriBuilderService = new KakaoUriBuilderService()
}
def "buildUriByAddressSearch - 한글 파라미터의 경우 정상적으로 인코딩"() {
given:
def address = "서울 성북구"
def charset = StandardCharsets.UTF_8
when:
def uri = kakaoUriBuilderService.buildUriByAddressSearch(address)
def decodedResult = URLDecoder.decode(uri.toString(), charset)
then:
decodedResult == "https://dapi.kakao.com/v2/local/search/address.json?query=서울 성북구"
}
}
728x90
반응형
'개발공부 > JAVA Spring' 카테고리의 다른 글
Spring Data JPA 주의사항 - 영속성 컨텍스트 (0) | 2023.01.19 |
---|---|
Spring Data JPA, DAO, DTO, Entity, Repository 란? (0) | 2023.01.16 |
[springboot] redis, mariadb docker-compose (0) | 2022.12.18 |
[springboot] Spring Profile (0) | 2022.12.18 |
[springboot] jar 파일 생성 및 도커 파일 작성하기 (0) | 2022.12.17 |
댓글