Table of contents

HtmlUnit

웹 MVC - 템플릿엔진 with thymleaf 에서 잠시 언급했던 HtmlUnit에 대해 알아보자. HtmlUnit는 HTML을 단위테스트하기 위한 라이브러리로, HTML 템플릿 뷰 테스트를 보다 전문적으로 할 수 있다.

링크의 문서를 확인해보면 text, html, xml, xpath 등을 지원하며 form element를 submit하는 테스트도 지원하는 것을 알 수 있다.

실습

우선 의존성이 필요하다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>htmlunit-driver</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <scope>test</scope>
</dependency>

테스트용으로 사용하기 위해 스코프를 test로 지정한다.

@Test
public void hello() throws Exception {
    mockMvc.perform(get("/hello"))
        .andExpect(status().isOk())
        .andDo(print())
        .andExpect(view().name("hello"))
        .andExpect(model().attribute("name", is("jch")))
        .andExpect(content().string(containsString("jch")));
}

위 테스트 코드는 웹 MVC - 템플릿엔진 with thymleaf에서 작성한 테스트 코드로 hello.html을 테스트한다.

view의 model에는 name 속성에 jch라는 값을 담고있으며 h1태그로 해당 속성을 출력한다. 이 코드를 HtmlUnit을 이용한 테스트로 변경해보자.

@Autowired
WebClient webClient;

@Test
public void helloUseHtmlUnit() throws IOException {
    HtmlPage page = webClient.getPage("/hello");
    HtmlHeading1 h1 = page.getFirstByXPath("//h1");
    assertThat(h1.getTextContent()).isEqualToIgnoringCase("jch");
}

HtmlUnit을 추가하면 WebClient를 주입받을 수 있다. "/hello"로 요청하여 view를 HtmlPage로 가져온 뒤, h1태그를 찾아서 텍스트를 테스트한다.

MockMvc를 이용한 테스트는 응답코드, view 이름, model 값 등을 테스트할 수 있지만 HtmlUnit의 WebClient를 이용한 테스트는 HTML 구조에 특화된 테스트를 수행할 수 있다.

해당 포스팅은 스프링 부트 개념과 활용 강의 내용을 토대로 작성하였습니다.