2009년 7월 16일 목요일

JUnit을 이용한 UI 테스트

흔히, GUI가 있는 프로그램은 일일이 개발자가 눈으로 보거나 이벤트를 날려보는 식으로 테스트가 진행된다.
쉽지 않은 일이기에 TDD 에서는 이것마저 테스트가 가능하다고 한다. 하지만 이것 역시나 쉽지 않은 것이 GUI 프로그램인 경우에는 아무리 생각해 보아도 TDD를 적용하기 힘들다는 생각을 버리기 힘들다.

그리고 최근 사내에서 TDD를 전파하는 중인데 웹 애플리케이션을 많이 하는 곳이 아니고 핸드셋 단말을 많이 개발하는 곳이어서 아무래도 UI 이슈가 많은 곳이다.
그러다보니 TDD를 적용해 보기에 어려움이 많은 부분이 있다. 그래서인지 설득력있게 이야기해 보아도 쉽게 적용하는 개발자를 보질 못했다.
더군다나 나역시 로직컬한 부분에서는 TDD를 적용해 오긴 했지만 UI에 TDD를 적용해 보진 않았다.

그런중에 안드로이드 애플리케이션을 개발해야 하는데, 아무래도 UI 이슈가 많아진다.
그리고 개발하고자 하는 프로젝트가 2D Graphics 영역이어서 일일이 랜더링해야 하는 코드가 많아져 graphics 쪽으로 공부를 하는 중이다.
그런 중에 책의 소스코드를 unit test 할 수 있는 방법이 없을까?하는 생각으로 간단하게 UI를 JUnit 을 이용하여 테스트해 보았다.
작은 시간이니 하나씩 UI에 적용할 방법을 찾는 것도 좋은 방법이란 생각이 든다^^

먼저, ApplicationFrame.java 라는 정말로 심플한 UI 코드를 보자. Frame이 중앙에 모니터의 중앙에 위치하도록 center() 라는 메소드를 가지고 있다.

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * @author Sang-Hyup, Lee
 *
 */
public class ApplicationFrame extends Frame {

 public ApplicationFrame() {
  super("ApplicationFrame v1.0");
 }
 
 public ApplicationFrame(String title) {
  super(title);
  createUI();
 }

 protected void createUI() {
  // TODO Auto-generated method stub
  setSize(500, 400);
  center();
 
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
   }
  });
 }

 public void center() {
  // TODO Auto-generated method stub
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  Dimension frameSize = getSize();
 
  int x = (screenSize.width - frameSize.width) / 2;
  int y = (screenSize.height - frameSize.height) / 2;
 
  setLocation(x, y);
 }
 
}


 여기서 테스트를 해 보고 싶은 것이 모니터의 실질적인 width, height 값과 중앙에 위치했을 때 center() 메소드에서 사용한 알고리즘이 맞는가? 하는 것이다.
간단한 알고리즘이어서 오류가 발생할 경우는 거의 없지만 TDD 개발 책에서도 대부분은 이렇게 심플한 예제로 설명하니 부담이 오히려 없을 듯 하다.

만약, 자신의 모니터의 width, height 값을 정확하게 알아본 후 다음의 테스트 코드를 적용해 볼 수 있을 것이다.


import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;

import junit.framework.TestCase;

import com.mediachorus.java2d.graphics.frame.ApplicationFrame;

/**
 * @author Sang-Hyup, Lee
 *
 */
public class ScreenSizeTest extends TestCase {

 public void testScreenSize() {
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

  assertEquals(1280, screenSize.width);
  assertEquals(1024, screenSize.height);
 }
 
 public void testGetLocation() {
  ApplicationFrame appFrame = new ApplicationFrame("This is test frame");
 
  appFrame.center();
 
  Point point = appFrame.getLocation();
 
  assertEquals(390, point.x);
  assertEquals(312, point.y);
 
  assertEquals(390.0d, point.getX());
  assertEquals(312.0d, point.getY());
 }
 
}


모니터가 1280 * 1024 인 경우 해당 Dimension 클래스를 이용한 width, height 값을 통해서 알 수 있고, testGetLocation() 테스트 메소드를 통해서 center() 메소드가 실제로 정상적으로 작동하는지 검증할 수 있다.

간단한 UI 테스트를 통한 TDD 적용이다. 위의 코드를 이용해서 각자 모니터, center() 알고리즘의 검증, 계산 등을 해보면 좋은 경험이 될 것이다.
이런 테스트 코드를 가지고 있으면 좋은 점 또 하나는 일일이 로그를 찍어보지 않아도 해당하는 값들을 예측할 수 있다는 것이다.

댓글 없음: