Please Enable JavaScript!
Gon[ Enable JavaScript ]

Controller 영역인 브라우저에서의 단위테스트를 위한 HtmlUnit 사용하기

자바(JAVA)
반응형

Controller 영역인 브라우저에서의 단위테스트를 위한 HtmlUnit 사용하기

 

개발환경 : JDK 1.5, Junit 3, HtmlUnit 2.7,  window XP

 

HtmlUnit WebApplication 개발시 브라우저에서 테스트하지 않고 Java

프로그램을 단위 테스트 해볼수 있는 framework 이다. javascript, Ajax 를 완벽하게

지원할 뿐만 아니라 Internet Explorer, Firefox 두개의 브라우저에서 테스트 해볼수

있다.

 

(1) 환경설정

 

이것의 주요 목적은 개발된 웹사이트의 단위테스트와 정보를 리턴받기 위함이다.

http://htmlunit.sourceforge.net/ 에 주요내용이 있으므로 참고하기 바란다.

일단 왼쪽에 downloads 를 클릭해 파일을 다운받는다. 파일안 lib 폴더에

의존적인 class 들이 있으므로 그대로 복사해서 쓰면 된다.

HtmlUnit 을 돌리기 위해서 어떤 jar 버전이 의존적인지 확인해 볼려면 다음

페이지로 가서 확인하면된다. http://htmlunit.sourceforge.net/dependencies.html

다운받은 jar 파일을 복사해넣고 간단히 테스트 프로그램을 만들어서 실행해보자.

HtmlUnit 을 테스트하기위해서는 Junit 프레임웍을 사용해야한다.

windows > Preferences > Java Build Path 로 들어간다. Libraries 탭을 클릭해서

설정화면으로 들어가자. 화면에서 오른쪽 버튼중 Add Library 를 클릭하게 되면

eclipse 에서 제공하는 라이브러리 패키지 리스트가 제공된다. 그중 Junit

선택하게 되면 Junit3, Junit4 중 하나를 선택하게 되는데 나는 이전부터 Junit3

익숙해져 있어서 3 를 선택했다.

(2) 테스트 클래스 제작

 

이제 Junit 클래스를 하나 만든다. junit.framework.TestCase 클래스를 상속받아

만드는데 함수실행을 위해서는 함수명 앞에 testXXX 형태로 이름을 만들어야

framework 이 인식하게 된다. 사이트에서 사용한 예제는 Junit4 를 기반으로

했기 때문에 @Test 어노테이션을 사용할수 있지만 Juit3 에서는 못하기 때문에

함수명을 textXXX 로 만들수 밖에 없다.

import junit.framework.TestCase;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class WebSubmit extends TestCase {
       public void testHomePage() throws Exception {
             final WebClient webClient = new WebClient();
             final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
             assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText());

             final String pageAsXml = page.asXml();
             assertTrue(pageAsXml.contains(""));

             final String pageAsText = page.asText();
             assertTrue(pageAsText.contains("Support for the HTTP and HTTPS protocols"));
        }
}

위 소스를 테스트 한 결과이다. 왼쪽에 보면 문제 없이 진행된 것을 볼수 있다.

그리고 로그를 확인해 보면 사이트로 전송받은 HTML 내용이 DEBUG 모드로

출력되어있는 것을 볼수 있다. Junit 은 기본적으로 Log4j 를 사용하기 때문에

log4j 설정값이 들어있는 properties 를 패키지 제일 상단에 복사해 넣는다.

만약 log4j.properties 가 없다면 아래와 같은 에러가 날것이다. 그리고 HtmlUnit 에서

출력하는 상세로그를 확인할수 없어 디버그 하기 힘들다.

log4j:WARN No appenders could be found for logger (com.gargoylesoftware.htmlunit.WebClient).

log4j:WARN Please initialize the log4j system properly.

다음 테스트 내용은 브라우저에서 실행할 내용을 단위테스트 함수에서 실행하는

것이다. 보통 브라우저에서 회원가입이나 데이터를 입력해서 submit 을 해야되는

경우 할 때 마다 수많은 입력값을 넣어 테스트를 하고 실패했을 경우 다시

재입력해야되는 귀찮은 작업을 해야한다. 하지만 단위테스트 함수를 만들어 놓고

그 안에 입력값을 고정으로 해서 작업한다면 다시 재입력해야 되는 수고는 덜수

있을 뿐만 아니라 값을 넘기고 난 이후의 비즈니스 로직을 효과적이고 빠르게

테스트 해볼수 있을 것이다
public void testSubmittingForm() throws Exception {
      
      final WebClient webClient = new WebClient();
      // WAS 를 띄운다. 테스트 하고자 하는 페이지로 접근하여 데이타를 받아온다
      final HtmlPage page1 = webClient.getPage("http://localhost:8080/test.html");
      // HTML 에서 form 객체를 가져온다.
      final HtmlForm form = page1.getFormByName("myform");
    
      // Button 객체를 가져온다.
      final HtmlSubmitInput button = form.getInputByName("button");
      // Input text 객체를 가져온다.
      final HtmlTextInput textField = form.getInputByName("userid");
      textField.setValueAttribute("값변경"); // Input text 값을 변경한다.

      // 버튼 클릭과 같은 기능을 한다. javascript 함수 호출이나 submit 기능을 
      // 구현해 놓았다면 그대로 실행될 것이다.
      final HtmlPage page2 = button.click();
}
반응형
Posted by 녹두장군1
,