DbUnit 사용시 주의사항

최근에 테스트코드를 만들 때 spock-dbunit을 사용하면서 이상하게 동작하는 부분이 있어서

관련사항을 간단히 정리해 보았습니다.


1. spock-dbunit @DbUnit 데이터 초기화 문제

테스트코드 실행 전, DB의 데이터를 원하는 데이터로 초기화하기 위해 spock-dbunit

라이브러리의 @DbUnit 어노테이션을 아래와 같이 사용하였더니 예상과 다른 데이터가

들어갔습니다.

@DbUnit
def content = {
    User(id: 1, name: 'janbols')
    User(id: 2, name: 'bluepoet', ip: '127.0.0.1')

    Other_User(id: 1, name: 'bluepoet', ip: '127.0.0.1')
    Other_User(id: 2, name: 'janbols')
    Other_User(id: 3, name: 'tester', ip: '1.2.3.4')
}

Other_User 테이블은 3개 row의 id, name, ip 필드에 세팅한대로 값이 들어갔지만,

User 테이블의 2번 아이디의 ip필드의 “127.0.0.1”값은 들어가지 않았습니다.

관련해서 간단하게 테스트코드를 만들어 pr을 날렸고, 해당 pr이 merge되면서 프로젝트

운영자로부터 그것이 DbUnit의 결함이라는 피드백을 받았습니다.

참고 url : https://github.com/janbols/spock-dbunit/issues/4

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-7-45-54

스크린샷 2017-01-16 오후 7.56.42.png

결론적으로, 내가 검증하고자 하는 필드는 첫번째 행에 모두 넣어야 합니다.

Other_User는 첫번째 행에 ip필드가 들어가 있어서 3번째 행에도 ip필드에 값이 정상적으로

들어가게 됩니다.

이와 관련한 DbUnit의 아래 내용을 읽어보시면 도움이 될 것 같습니다.

http://dbunit.sourceforge.net/faq.html#differentcolumnnumber

참고로, spring-test-dbunit은 동일한 테스트에서 위와 같은 문제가 발생하지 않았습니다.

@Test
@DatabaseSetup("sampleData1.xml")
public void tesNoValueLastName() throws Exception {
    List<Person> personList = this.personService.find("bl");
    assertEquals(1, personList.size());
    assertEquals("blue", personList.get(0).getFirstName());
    assertEquals("poet", personList.get(0).getLastName());
}
<!-- sampleData1.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
	<Person id="0" title="Mr" />
	<Person id="1" title="Mr" firstName="Mario" lastName="Zagar"/>
	<Person id="2" title="Mr" firstName="blue" lastName="poet"/>
</dataset>

참고 url :  http://bit.ly/2j7HEM4

2. spring-test-dbunit @ExpectedDatabase 반복사용 문제

spring-test-dbunit 1.3.0 이전버전을 사용하면, @ExpectedDatabase 어노테이션을

하나의 메서드에 반복 사용시, 마지막 어노테이션의 내용만 검증되는 버그가 있습니다.

그러므로 아래 코드의 expectedProductData.xml의 데이터가 틀려도 이 테스트는

성공하게 됩니다.

@ExpectDatabases 어노테이션도 동일하게 동작합니다.

참고 url : http://bit.ly/2jmqwTE

@Test
@DatabaseSetup("sampleData.xml")
@DatabaseSetup("ProductInitData.xml")
@ExpectedDatabase(value = "expectedProductData.xml", assertionMode = DatabaseAssertionMode.NON_STRICT) // verify error!
@ExpectedDatabase(value = "sampleData.xml", assertionMode = DatabaseAssertionMode.NON_STRICT)
public void testVerifyMultiTableValues() throws Exception {
}

스크린샷 2017-01-18 오후 3.17.44.png

이에 대해 override 설정을 “false”로 주면 해결되지만, 이에 대해 불편을 제기한 이슈가 있어서

1.3.0버전에 이 버그가 패치되었습니다.

1.3.0 버전에선 위 테스트가 원래 의도한 대로 실패하게 됩니다.

참고 url : https://github.com/springtestdbunit/spring-test-dbunit/issues/64
               http://bit.ly/2iGrbxi

 

 

 

Advertisements