프로그래밍 노트/TEST를 해보자

Hamcrest 프레임워크사용하기_1

깡냉쓰 2019. 11. 13. 22:22
728x90
반응형

Junit을 사용할 때 Hamcrest 프레임워크를 사용하면 가독성은 물론이고 코드의 조건을 조금 더 손쉽게 확인할 수 있다.

Hamcrest란?

Hamcrest는 소프트웨어 테스트를 위한 framework.
기존의 matchers 클래스를 통해 코드의 조건을 확인할 수 있음
Junit에서 Hamcrest matcher를 사용하려면 assertThat 문 뒤에 하나 또는 여러 개의 matchers를 사용한다.
⇒ Hamcrest는 최대한 가독성이 있는 test scripts를 가지는 것을 목표로 하고 있음

boolean a;
boolean b;

assertThat(a, equalTo(b));
assertThat(a, is(equalTo(b));
assertThat(a, is(b)); // is 메소드는 equalTo(value)에 대한 thin wrapper

복잡한 단언문을 서술적으로 가독성 높게 작성 가능
Junit4에서 통합 지원, assertThat(T actual, Matcher<T> matcher)

  • 핵심 매처 : org.hamcrest.CoreMatchers
  • 전체 매처 : org.hamcrest.Matchers

Junit4 assert statements와 Hamcrest matchers를 비교

// JUnit 4 for equals check 
assertEquals(expected, actual);
// Hamcrest for equals check 
assertThat(actual, is(equalTo(expected)));


// JUnit 4 for not equals check 
assertNotEquals(expected, actual) 
// Hamcrest for not equals check 
assertThat(actual, is(not(equalTo(expected))));

// Junit4
assertTrue(result instanceof String);
// Hamcrest
assertThat(result, instanceOf(String.class));

// Junit4
assertTrue(result.contains("x") || result.contains("y") || result.contains("z"))
// Hamcrest
assertThat(result, is(hasItem(anyOf(equalTo("x", equalTo("y"), equalTo("z"))))));

Hamcrest 매처 사용하기

pom.xml에 추가

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-library</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency>

spring boot에서는 다음 starter를 추가하면 자동으로 junit, hamcrest, SpringTest 등을 추가해준다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

Hamcrest 사용하기

Hamcrest matcher

다음은 가장 중요한 Hamcrest matchers들의 모음이다.

  • allOf - matches if all matchers match (short circuits)
  • anyOf - matches if any matchers match (short circuits)
  • not - matches if the wrapped matcher doesn’t match and vice
  • equalTo - test object equality using the equals method
  • is - decorator for equalTo to improve readability
  • hasToString - test Object.toString
  • instanceOf, isCompatibleType - test type
  • notNullValue, nullValue - test for null
  • sameInstance - test object identity
  • hasEntry, hasKey, hasValue - test a map contains an entry, key or value
  • hasItem, hasItems - test a collection contains elements
  • hasItemInArray - test an array contains an element
  • closeTo - test floating point values are close to a given value
  • greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
  • equalToIgnoringCase - test string equality ignoring case
  • equalToIgnoringWhiteSpace - test string equality ignoring differences in runs of whitespace
  • containsString, endsWith, startsWith - test string matching

To see all matchers, use API reference

728x90
반응형