본문 바로가기
개발공부/JAVA Spring

테스트 코드 작성 프레임워크 - Spock

by bzerome240 2023. 1. 4.

 

테스트 코드의 중요성


기능에 대한 불확실성 감소, 기능을 안전하게 보호
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
반응형

댓글