lang/tdd

TDD jUnit4 비교표현확장: Hamcrest

C/H 2010. 12. 7. 08:30
Hamcrest : 비교표현확장
JUnit 4.7, 4.8 기본 탑재되어 있는 Hamcrest 버전은 1.1 core 입니다.

Hamcrest(햄크레스트)는 jMock이라는 Mock 라이브러리 저자들이 참여해 만들고 있는Matcher 라이브러리입니다.
테스트 표현식을 작성할 때 좀 더 문맥적으로 자연스럽고, 우아한 문장을 만들 수 있게 도와줍니다.
개발자만이 읽을 수 있는 프로그램밍 언어라라는 느낌보다 좀 더 문장체에 가까운 느낌으로 넓은 범주의 사람들이 함께 이해할 수 있는 형태로 만들어줍니다.

현재 Hamcrest는 Java 이외에도 C++, Objective-C, Phthon 그리고 PHP 버전으로도 포팅되어 있습니다.
Matcher 라이브러리: 필터나 검색등을 위해 값을 비교할 때 좀 더 편리하게 시용할 수 있게 도와주는 라이브러리입니다.

Hamcrest 라이브러리는 기본적으로 assertEquals 대신에 assertThat이라는 구분사용을 권장한다.
공학적인 느낌을 주는 딱딱한 assertEquals 보다는 assertThat이 좀 더 문맥적인 흐르을 만들어준다고 여기기 때문입니다. ( 영어라서 이해를 못하겠습니다. ㅜ.ㅜ)
asertEquals("YoungJim", customer.getName() );
assertThat( customer.getName(), is("YoungJim") );

// 적용 전
assertEquals(100, account.getBalance());
// 적용 후
aseertThat(account.getBalance(), is(equalTo(10000)));


// 적용 전
assertNotNull(resorce.newConnection());
// 적용 후
assertThat(resource.newConection(), is(notNullValue());

// 적용 전
assertTrue(account.getBalance() > 0);
// 적용 후
assertThat(account.getBalance(), isGreaterThan(0));

// 적용 전
assertTrue(user.getloginName().indexOf("Guest") > -1);
// 적용 후
asertThat(user.getLoginName(), containsString("Guest"));
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.Test;

public class HamcrestTest{
	@Test
	public void testArray() throws Exception {
		assertThat("Start Date 비교", "2010/02/03", is("2010/02/04"));
	}
}

패키지설명
org.hamcrest.core 오브젝트나 값들에 대한 기본적인 Matcher들
org.hamcrest.beans Java 빈(Bean)과 그 값 비교에 사용되는 Matcher들
org.hamcrest.coolection 배열과 컬렉션 Matcher들
org.hamcrest.number 수 비교를 하기 위한 Matcher들
org.hamcrest.object 오브젝트와 클래스들 비교하는 Matcher들
org.hamcrest.test문자열 비교
org.hamcrest.xmlXML 문서 비교

  • 코어(Core)
    메소드설명클래스 명
     anything어떤 오브젝트가 사용되든 일치한다고 판별한다. IsAnything
     describedAs테스트 실패 시에 보여줄 추가적인 메시지를 만들어주는 메시지 테코레이터 DescribedAs
     equalTo두 오브텍트가 동일한지 판별한다.IsEqual
     is내부적으로 equalTo와 동일하다.
    가독성 증진용.
    아래 세문장은 의미가 동일하다.
    [code java]assertThat(entity, equalTo(expectedEntity));
    assertThat(entity, is(equalTo(expectedEntity)));
    assertThat(entity, is(expectedEntity));
    [/code]
    Is

  • 오브젝트(Object)
    메소드설명클래스 명
     hasToStringtoString 메소드 값과 일치 여부를 판별한다. HasToString
     instanceOf
     typeCompatibleWith
    동일 인스턴스인지 타입비교(instance of).
    동일하거나 상위 클래스, 인터페이스인지 판별
    IsInstanceOf
    IsCompatibleType
     notNullValue
     nullValue
    Null인지, 아닌지 판별 IsNull
     sameInstanceObject가 완전히 동일한지 비교.
    equals 비교가 아닌 ==(주소비교)로 비교하는 것과 동일
    isSame

  • 논리(Logical)
    메소드설명클래스 명
     allOf비교하는 두 오브젝트가 각각 여러 개의 다른 오브젝트를 포함하고 있을 경우에, 이를테면 collection 같은 오브젝트일 경우 서로 동일한지 판별한다. Java의 숏서킷(&& 비교)과 마찬가지로 한 부분이라도 다른 부분이 나오면 그 순간 false를 돌려준다. AllOf
     anyOfallOf와 비슷하나 anyOf는 하나라도 일치하는 것이 나오면 true로 판단한다.
    Java의 숏서킷(||)과 마찬가지로 한 번이라도 일치하면 true를 돌려준다.
    AnyOf
     not서로 같지 않아야 한다. IsNot

  • 빈즈(Beans)
    메소드설명클래스 명
     hasPropertyJava 빈즈 프로퍼티 테스트 HasProperty

  • 컬렉션(Collection)
    메소드설명클래스 명
     array두 배열 내의 요소가 모두 일치하는지 판별 IsArray
     hasEntry, hasKey, hasValue맴(Map)요소에 대한 포함 여부 판단 isMapContaining
     hasItem, hasItems특정 요소들을 포함하고 있는지 여부 판단 IsCollectionContaining
     hasItemInArray배열 내에 찾는 대상이 들어 있는지 여부를 판별 IsArrayContaining

  • 숫자(Number)
    메소드설명클래스 명
     closeTo부동소수점(floating point) 값에 대한 근사값 내 일치 여부, 값(value)과 오차(delta)를 인자로 갖는다. IsCloseTo
     greaterThan
     greaterThanOrEqualTo
    값 비교. >, >= OrderingComparison
     lessThan
     lessThanOrEqualTo
    값 비교. <, <= OrderingComparison

  • 텍스트(Text)
    메소드설명클래스 명
     containsString문자열이 포함되어 있는지 여부 StringContains
     startsWith특정 문자열로 시작 StringStartsWith
     endsWith특정 문자열로 종료 StringEndsWith
     equalToIgnoringCase대소문자 구분하지 않고 문자비교 IsEqualIgnoringCase
     equalToIgnoringWithSpace문자열 사이의 공백 여부를 구분하지 않고 비교 IsEqualIgnoringWhiteSpace


반응형

'lang > tdd' 카테고리의 다른 글

OOP 객체 액션  (0) 2010.12.14
TDD 우분투에서 phpunit 설치  (0) 2010.12.08
TDD jUnit4 특징  (0) 2010.12.06
TDD 실습 - 은행계좌(Account) 클래스 만들기  (0) 2010.12.03
TDD 개발 진행방식  (0) 2010.12.02