컴퓨터공학 기초/Java

단위테스트 JUNIT (2)

레필리아 2012. 3. 8. 17:56


1. Junit 테스트를 실행하는 방법

 

일단 본인의 이클립스에 junit 이 플러그인 되어 있다면 실행 버튼으로 간단하게 실행이 가능하다.

 

안되어 있다면 window > update > 검색해서 junit 플러그인을 설치하도록 하자

 

아니라면 java junit.swingui.TestRunner 를 실행하여 그래픽 환경에서 테스트 할 소스 파일을 선택하여 테스트 하거나

 

java junit.textui.TestRunner 테스트할 소스파일이름(확장자 제외) 를 실행하여 테스트 할 수 있다

 

 

 

 

2. 무엇을 테스트 해야 하는가?

 

2,1 경계조건

 

- 값이 기대한 형식과 일치하는가?

 

- 적절한 순서대로 있거나 그렇지 않은가?

 

- 적당한 최소값과 최대값 사이에 있는 값인가?

 

- 값이 존재하는가?

 

- 확실히 충분한 개수의 값이 존재하는가?

 

- 모든것인 제시간에 순서대로 일어나는가?

 

* 모든 경계조건의 테스트는 Black Box 혹은 White Box 의 테스트 케이스를 만들어 테스트 하는것이다.

* 테스트 케이스는 db가 될 수도 있고 파일이나 하드코딩 일수도 있다.

 

2.2 교차확인

 

- 테스트 하고자 하는 메소드를 여러가지 다른 알고리즘에 의해 확인해 본다.

 

- 테스트 하고자 하는 메소드가 다른 클래스에서 영향을 받을 경우 여러개의 클래스에서 결과 값을 교차 확인한다.

 

 

* 회귀테스트 : 모듈을 수정한 후 동작에 이상이 없는지 확인하는 테스트

 

 

2.3 에러발생

 

- 예상되는 에러나 예외상황을 발생시켜보자

 

 

 

 

3. 모의객체를 이용한 테스트 (Mock Object)

 

단위테스트의 목적은 한번에 메스드 하나만 실행해 보는 것인데, 그 메소드가 네트워크나 데이터베이스나 서블릿 엔진과 같은

 

제어하기 어려운 것들과 연관되어 있다면 어떻게 할 것인가?

 

이때에 우리는 모의 객체(Mock Object)를 사용하여 테스트를 수행할 수 있다.

 

 

3.1 모의객체를 사용하는 경우

 

- 진짜 객체를 준비하기 어렵거나 진짜 객체가 느릴 경우

 

- 진짜 객체가 직접 유발시키기 어려운 동작을 하거나 진짜 객체가 아직 존재하지 않을 경우

 

 

3.2 모의객체 예제

 

3.2.1 개발자가 모의객체를 직접 정의하는 경우

 

-------------------------------------------------------------------------------------------

import junit.framework.*;

import java.util.*;

 

// 현재 시간을 구해서 애플리케이션에서 사용하도록 애플리케이션 환경 객체에 세팅하는 클래스

// 애플리케이션 환경 객체가 없어서 모의객체로 구현하였다.

public void TestChecker extends TestCase {

    public void testQuittingTime(){

            MockSystemEnv env = new MockSystemEnv();

         

            Calendar cal  = Calendar.getInstance();

            cal.set(cal.YEAR, 2004);

            cal.set(cal.MONTH, 10);

            cal.set(cal.DAY_OF_MONTH, 1);

            cal.set(cal.HOUR_OF_DAY, 16);

            cal.set(cal.MINUTE, 55);

 

            long t1 = cal.getTimeInMillis();

 

            env.setTime(t1);

           

            .

            .

            .

    }

}

-------------------------------------------------------------------------------------------

 

setTime 메소드를 구현한 MockSystemEnv 이라는 모의객체를 생성하여 테스트한다.

 

 

 

3.2.2 mockObject 를 사용하여 정의하는 경우

 

-------------------------------------------------------------------------------------------

모의객체 패키지는 http://www.mockobjects.com 에서 다운받을 수 있다.

아래는 서블릿 엔진에 대한 모의 객체를 사용한 예제이다.

-------------------------------------------------------------------------------------------

import junit.framework.*;

import com.mockobjects.servlet.*;

 

public class TestTempServlet extands TestCase {

          public void test_bad_parameter() throw Exception {

                TemperatureServlet s = new TemperatureServlet();

 

                MockHttpServletRequest request = new MockHttpServletRequest();

                MockHttpServletRequest response = new MockHttpServletResponse();

 

          }

}

-------------------------------------------------------------------------------------------

 

MockHttpServletRequest 와 MockHttpServletRequest 는  com.mockobjects.servlet.* 패키지에서

 

지원하는 모의객체이다.

 

 

 

4. 좋은 테스트

 

- 테스트는 자동화 되어 IDE 툴의 버튼 하나 누르는 것 이상의 수고를 요ㅛ구해서는 안된다.

 

- 반복적, 독립적 테스트가 가능해야 한다.

 

- 단위 테스트의 코드는 프로젝트에서 선정한 전문적인 표준에 의거해야한다.