[Spock]spock-dbunit 초간단 예제

기존 스프링 프레임워크 기반에서 어플리케이션 개발시, DB와 연관된 테스트코드를 만들기 위해

spring-test-dbunit 라이브러리를 사용했습니다.

최근 프로젝트에서 스프링부트를 사용하면서, 다시 DB에 대해 테스트코드를 만들어야 되는 일이

생겼는데요. 테스트 프레임워크는  전부터 즐겨쓰던 groovy기반의 spock을 사용하고 있습니다.

spock 역시 dbunit관련 라이브러리가 있을까 살펴보던 중, spock-dbunit을 발견해서

간단히 CRUD 예제를 만들어 보았습니다.

전에 spring-test-dbunit을 사용할 때는, 별도의 xml파일을 만들어야 되서 상당히 귀찮고

오타도 많아 테스트코드 작성시 어려움이 많았었지만, spock-dbunit의 모토가

그 어려움과 귀찮음을 피하는 것이라고 하니 개인적인 입장에서는 상당히 호감이 갔습니다.

그리고 무엇보다 sql query를 소스상에 직접 작성해서 테스트코드를 만들 수 있는 점도

큰 장점으로 생각되네요.

물론, 개인개발자가 1인이 만들었고 처음 만든게 2013년 중반임에도 아직 버전이 0.2라서

spring-test-dbunit보다 상대적으로 기능상 쓰기에 더 불편 할수도 있습니다.

package net.bluepoet.exercise

import be.janbols.spock.extension.dbunit.DbUnit
import groovy.sql.Sql
import org.apache.tomcat.jdbc.pool.DataSource
import spock.lang.Specification

/**
 * Created by bluepoet on 2016. 11. 17..
 */
class SpockDBUnitTest extends Specification {

    DataSource dataSource

    @DbUnit
    def content = {
        User(id: 1, name: 'bluepoet', age: 20, 'phone_number': '010-0000-0001')
        User(id: 2, name: 'tester', age: 10, 'phone_number': '010-0000-0002')
    }

    def setup() {
        dataSource = new DataSource()
        dataSource.driverClassName = 'org.h2.Driver'
        dataSource.url = 'jdbc:h2:mem:'
        dataSource.username = 'sa'
        dataSource.password = ''
        new Sql(dataSource).execute("CREATE TABLE User(id INT PRIMARY KEY, name VARCHAR(255), age INT, phone_number VARCHAR(20))")
    }

    def cleanup() {
        new Sql(dataSource).execute("drop table User")
    }

    def "총 유저수가 몇명인지 테스트한다."() {
        when:
        def result = new Sql(dataSource).firstRow("select count(*) as cnt from User")

        then:
        result.cnt == 2
    }

    def "특정 유저정보를 가져와 확인한다."() {
        expect:
        new Sql(dataSource).firstRow("select * from User where id = " + id) == result

        where:
        id | result
        1  | [ID: 1, NAME: 'bluepoet', AGE: 20, PHONE_NUMBER: '010-0000-0001']
        2  | [ID: 2, NAME: 'tester', AGE: 10, PHONE_NUMBER: '010-0000-0002']
    }

    def "특정 유저정보를 수정하고 결과를 확인한다."() {
        when:
        new Sql(dataSource).executeUpdate("update User set age=12, phone_number='010-1111-2222' where id=1")
        def result = new Sql(dataSource).firstRow("select * from User where id=1")

        then:
        result.age == 12
        result.phone_number == '010-1111-2222'
    }

    def "특정 유저를 삭제하고 총 유저수를 확인한다."() {
        when:
        new Sql(dataSource).executeUpdate("delete from User where id=2")
        def result = new Sql(dataSource).firstRow("select count(*) as cnt from User")

        then:
        result.cnt == 1
    }
}

Github url은 https://github.com/bluepoet/spock-dbunit-exercise 를 참고하세요.

Advertisements

[Spock]spock-dbunit 초간단 예제”에 대한 1개의 생각

  1. 핑백: [2016]올해를 마치며.. 회고! | The road to professional programmer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중