ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [17] Spring Web MVC : HtmlUnit
    Spring/Spring boot 2020. 6. 26. 08:55
    반응형

     

    [HtmlUnit]

    HtmlUnit은 HTML를 unit test 하기 위한 tool입니다. Spring boot는 HtmlUnit에 대한 자동설정을 지원합니다.

    HtmlUnit을 사용하기 위해서는 먼저 관련된 두 가지 의존성을 추가해야 합니다. pom.xml을 열어 dependencies tag 안에 다음의 내용을 추가해주세요.

    <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>

     

     

    HtmlUnit을 통해 진행하는 test에 대해 적용할 수 있는 여러가지 요소들이 있습니다. 자세한 내용은 HtmlUnit에 대한 reference를 참고해 주세요. (reference 보기)

    1. form을 가져와서 submit하는 test mock-up
    2. 특정 browser를 지정하여 html rendering 결과를 받아올 수 있고,
    3. html 문서의 여러 element에 접근하여 확인할 수 있습니다.(HtmlPage.getElementById(String), HtmlPage.getElementByName(String) 등...)
    4. XPath는 xml 문서를 navigation할 때 유용한 query이며 xml은 html을 포함하므로 HtmlUnit에서도  XPath를 사용하여 query 할 수 있습니다.
    5. css selector를 사용할 수 있습니다.
    6. 마지막 WebClient constructor를 사용하면 proxy server 정보를 통해 연결해야하는 경우 proxy server 정보를 지정할 수 있습니다.

     


    [HtmlUnit 사용한 test 예제]

    HtmlUnit의 WebClient 객체를 사용하여 MockMvc보다 Html에 특화된 test를 진행할 수 있습니다. 여기에서는 ~/hello로 request 시 response 되는 page에서 첫 번째 h1 tag 요소를 찾아 그 안의 내용이 사용자가 원하는 내용인지 확인하는 예를 살펴보도록 합니다.

     

    상기 내용에 해당하는 test code는 다음과 같습니다.

    import static org.assertj.core.api.Assertions.assertThat;
    import static org.hamcrest.Matchers.containsString;
    import static org.hamcrest.Matchers.is;
    import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(SampleController.class)
    public class SampleControllerTest {
    
        @Autowired
        WebClient webClient;    //	①
    
        @Test
        public void hello_HtmlUnit_Test() throws Exception {
            HtmlPage page = webClient.getPage("/hello");    //	②
            HtmlHeading1 h1 = page.getFirstByXPath("//h1");   //	③
            assertThat(h1.getTextContent()).isEqualToIgnoringCase("dave");	//	④
        }
    }
    

    ① HtmlUnit의 WebClient를 주입받음.

    ② getPage() method는 매개 값으로 받은 URI로 request 하여 response 된 결과를 Page type의 객체로 반환합니다. Page type의 객체를 받아줄 때 Page type의 특수화된 type에 해당하는 HtmlPage type으로 받아주면 더 많은 행동을 할 수 있습니다.

    ③ getFirstByXPath() method를 통해 XPath로 가장 앞에 있는 h1을 가져오는데, 이때 반환되는 값이 Object type이므로 h1에 대한 ojbect type을 담을 수 있는 HtmlHeading1 type으로 받아줍니다.

    ④ 받아온 HtmlHeading1 type 객체의 text content를 받아와서 원하는 결과(여기서는 "dave")와 일치하는지 확인합니다.

     

    test 대상이 되는 controller와 view에 해당하는 code는 이전 post와 동일합니다.(이전 글 확인하기)

    댓글

Designed by Tistory.