JAVA/Spring Boot

spock 사용법(테스트 코드 작성)

algml0703 2023. 2. 23. 22:23
반응형

Spock를 활용한 테스트 코드 작성

기본 설정

1. 마우스 오른쪽 build.gradle 파일에서 Generate... - Add dependency...  클릭하면 아래와 같은 창이 나오는데 거기에 org.spockframework.spock를 검색 후 spock-core 찾고 testImplementation으로 변경해준 후 Add를 클릭한 후 2.3-groovy-3.0으로 선택하여 추가해준다

또한 위와 같이 org.cordhaus.groovy를 검색하여 testImplementation 'org.codehaus.groovy:groovy:3.0.0'도 추가.

spock는 groovy를 사용하기 때문에 plugin groovy도 추가해준다. 다시 마우스 오른쪽 Generate - Add gradle plugin을 클릭한 후 아래와 같이 나오면 groovy를 선택하여 추가해준다.

결과적으로 두 개의 dependency를 추가하고 한 개의 plugin을 추가해준다.

plugins {
    id 'org.springframework.boot' version "${springBootVersion}"
    apply plugin: 'groovy'
}

dependencies {
    api project(':board-api')
    implementation ("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb:${springBootVersion}")
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0'
    testImplementation 'org.codehaus.groovy:groovy:3.0.6'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

그런데 기존에는 위와 같이 하면 된다고 되어있었는데 나의 경우 계속해서 에러가 나서 build.gralde 파일을 아래와 같이 변경해주었다.

plugins {
    id 'org.springframework.boot' version "2.6.2"
    id 'groovy'
}

dependencies {
    api project(':board-api')
    implementation ("org.springframework.boot:spring-boot-starter-web:2.6.2")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb:2.6.2")
    testImplementation("org.springframework.boot:spring-boot-starter-test:2.6.2")
    testImplementation('org.spockframework:spock-core:2.3-groovy-3.0')
    testImplementation('org.spockframework:spock-spring:2.3-groovy-3.0')
    testImplementation('org.codehaus.groovy:groovy-all:3.0.0')
    testImplementation('org.junit.jupiter:junit-jupiter-api')
    testImplementation('org.junit.jupiter:junit-jupiter-engine:')
    testImplementation('org.junit.jupiter:junit-jupiter')
    testImplementation 'org.junit.platform:junit-platform-launcher'
    testImplementation 'org.junit.vintage:junit-vintage-engine'

}

test{
    useJUnitPlatform()
}

build.gradle 파일 수정후에는 반드시 다시 Relaod gradle project를 해주어야 한다. 

2. 위와 같이 의존성을 주입해준후에는 테스트를 작성할 폴더를 생성한다. 해당 테스트 코드를 관리할 폴더를 src폴더의 하위에 new - Directory 후 gradle-source-sets 으로 되어 있는 부분에서 src/test/groovy를 입력하여 폴더를 생성한다. 해당 폴더 생성 후 해당 폴더의 하위에 다시 테스트 할 파일의 경로와 같게 폴더 경로를 만들어준다. 나의 경우 com/mihee/board 하위의 파일을 테스트하려 했기 때문에 groovy폴더 하위에 동일하게 new - groovy class를 클릭한 후 com.mihee.board.[파일명Test]로 테스트 파일을 생성하여 주었다. 

3. 해당 클래스는 아래와 같이 spock에서 Specification을 상속받도록 한다.

import spock.lang.Specification

class BoardControllerTest extends Specification{

}

테스트하려는 코드 파일 - createBoard를 테스트할 계획이다.

작성한 test 코드

기본적으로 test 클래스 위에 @SpringBootTest 어노테이션을 붙여준다.

- def
자바스크립트에서 const 등과 같이 변수를 선언할 때 사용하는 명령어라고 할 수 있다. 
- given 
특정 코드를 테스트하기 위해 설정되어 있어야 할 기본 내용이라 할 수 있다. 예를 들어 특정 게시판 내용을 조회하는 서비스 로직을 테스트 하기 위해서는 적어도 한 개 이상의 게시글이 작성되어 있어야 한다. 나의 경우는 게시글 등록을 테스트 해보기 위해 게시글 샘플을 정의해두었다. 
- when
실질적으로 테스트하려는 코드의 작성 부분이라 할 수 있다.
- then
when에 의한 코드 테스트 결과 내용을 세팅해두는 부분이다.

테스트 코드 작성시 기본 문법은 아래와 같다.

def "[테스트명]" () {
    given:

    when:
    
    then:
	
}

 

반응형