JUnit과 같이 쓸 hamcrest

심규환·2022년 5월 12일
0

JUnit

목록 보기
1/1

테스트 코드 작성의 부족함을 많이 느끼게 되어 그때 그때 배운 것들을 작성하고자 합니다.
Junit과 hamcrest의 사용법을 작성한다기 보단 어떤 상황에서 해당 프레임워크를 사용했고 이때 이렇게 사용했다. 그리고 이렇게 사용하면 좋을 것 같다 정도로 작성하여 제가 기억하기 쉬울 수 있도록 하기 위합니다.

먼저 간단하게 외부에서 "/" 경로로 접근할 때, home.html으로 전달하는 간단한 컨트롤러 입니다.

HomeController

home.html

별 내용없이 이미지 파일과 body 부분에 여러 문장을 나열 했습니다.

출력 화면

귀여운 짱구 사진을 넣어봤습니다. ㅎㅎ

그리고 아래는 작성한 테스트 코드입니다.

TEST Code

테스트 코드를 중점으로 작성할 거라. 하나씩 살펴보겠습니다.

@ExtendWith(MockitoExtention.class) 는 spring-boot-starter-test 의존성을 추가하면 사용 가능 합니다.
어노테이션의 의미는 해당 클래스가 Mockito를 사용한다는 뜻입니다.

@WebMvcTest(컨트롤러) 는 스프링부트에서 제공하는 애노테이션인데. 스프링 MVC 애플리케이션의 형태로 테스트가 실행되도록 도와줍니다. 그래서 웹에서 컨트롤러의 접근과 처리에 대한 테스트를 진행할 수 있습니다. 이밖에도 @InJectMocks를 사용해서 테스트가 가능한데. 여기선 사용 안했으니 패스하겠습니다.

MockMvc 를 통해서 웹에서 접근하는 것처럼 모의 테스트를 진행할 수 있습니다.

먼저 mockMvc.perform의 인수 RequestBuilder를 통해서 내가 원하는 url에 원하는 request을 작성합니다.
여기서는 간단하게 MockMvcRequestBuilders.get는 GET 방식을 의미하고 인수로 "/" 경로를 줬습니다.

andExpect는 보면 알 수 있듯, 해당 url에 request를 하면 response로 오는 값들을 검증할 수 있습니다.

첫 번째 andExpect(status().isOk()) 는 반환되는 상태 값으로 OK 값 200 상태를 받는 다는 의미입니다.
두 번째 andExpect(view().name("home"))는 전달 받는 view 값의 이름은 home을 의미한다는 뜻입니다.
세 번째 andExpect(content().string(Matchers.containsString("Welcome to"))) 에서 content()는 reponse로 오는 값의 바디 부분을 검증할 때 사용되는데. 이어서 오는 string 메서드의 매개변수인 Matcher를 사용해서 내부 값을 확인할 수 있습니다.
여기서 사용된 Matchers가 이 글의 제목인 hamcrest 프레임워크에 있는 클래스입니다.
Matchers.containsString("Welcome to"))) 간단하게 해당 body 부분에 "Welcome to" 값이 존재하냐? 라는 테스트 문입니다.
이 밖에 다른 내용들은 같은 말이기 때문에 생략하겠습니다.

해당 테스트 코드를 테스트해보면 예쁜 초록불이 뜨면서 성공을 알려줍니다. 다만 한글을 작성할 경우, 테스트에 실패합니다. 이에 한글을 테스트하려면 어떡해야 할지 찾고 있지만 이 글의 내용엔 필요 없을 것 같아서 일단 생략하겠습니다.

여기서 보려는 건 바로 hamcrest의 Matchers 입니다.

제가 보통 값의 비교로 작성하는 코드는 아래와 같습니다.

String test = "11";
Assertions.assertThat(test).isEqualTo("11");

해당 Assertions는 org.assertj.core.api.Assertions.assertThat 입니다.

또는

String test = "11";
assertEquals(test, "11");

assertEquals는 org.junit.jupiter.api.Assertions 입니다.

이 두 개 모두 동일하게 값의 비교를 테스트할 수 있습니다. 두 번째 보단 첫 번째 방법이 조금 더 값을 비교하는 구나 라고 개인적으로 느끼는데.
여기서 Matchers 를 사용하면 조금 더 문장스러워져서 이해가 쉬워집니다.

String test = "11";
MatcherAssert.assertThat(test, is(equalTo("11")));

MatcherAssert의 assertThat를 사용하여 test 값과 뒤에 매개변수 값을 검증합니다.

뒤에 있는 is, equalTo 는 모두 Matchers.is, Matchers.equalTo 입니다.

모두 스테틱 임포트하고 간략하게 정리하면
assertThat(test, is(equalTo("11"))); 요롷게 나오는데.
각 값을 읽었을 때, test is equalTo "11" 라는 문장으로 보이게 됩니다.
이를 통해서 작성자가 아닌 코드를 모르는 타인이 봐도 test는 11 값과 같구나 라는 것을 이해하도록 도와줍니다.

앞으로의 테스트 코드는 가능하면 Matchers를 사용해서 협업에 도움이 될 수 있도록 작성하고자 합니다.

아래는 Hamcrest Documnetation 주소입니다.
http://hamcrest.org/JavaHamcrest/
http://hamcrest.org/JavaHamcrest/javadoc/2.2/

profile
장생농씬가?

0개의 댓글