TDD Helper 화면 Version 0.5

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지흠..AWT 보다 사용하기가….. 쪼금 더 편하고.. Visual은 많이 이쁘네요.

http://www.eclipse.org/swt/widgets/ 여기서 원하는 컴포넌트 그림을 찍은 다음에(마음 속으로) 그 그림의 아래에 보면 snipet과 javadoc이 보입니다. snipet을 클릭하면 예제 코드들이 나오는데 그 코드들을 Eclipse에서 실행시켜서 실제 화면이랑 코드랑 대조 해보면서 만들었습니다.

개선 할 것

1. 두 번째 화면에.. text는 label로 고쳐야 겠습니다.
2. 세 번째 화면에.. list에서 여러개를 선택할 수 있는데 여러개를 삭제 하는 기능을 구현해야 겠습니다.
3. 세 번째 화면에.. 새로운 work 추가하는 text 부분이 너무 쫍은데 이거 늘리는걸 API 찾아 봤는데..setBounds도 안먹고 setSize도 안먹고..ㅠ.ㅠ
4. 네 번째 화면은.. 좀 더 그리드 스럽게 보여 주고 싶습니다. Work Name, Worked Time 컬럼 두 개를 나타내도록 말이죠..table을 쓰면 되겠군요.

“운동할 시간이 없다”의 죽음의 나선

사용자 삽입 이미지
“테스트 주도 개발”
을 꼼꼼히 읽으셨다면 위 그림은 쉽게 이해 하실 수 있을 것 같습니다. 하지만 안 읽은 분들을 위해서…일반 화살표는 출발지의 노드가 높아지면 목적지의 노드도 높아지고, 동그라미가 그려져 있는 화살표는 출발지의 노드가 높아지면 목적지의 노드가 낮아지게 됩니다. And vice-versa.

따라서 귀찮아지면 운동을 안하게 되고 운동을 안하면 더 귀찮아지고 그럼 더 운동을 안하게 되는 ‘죽음의 고리’ 입니다. 이 악순환을 깨는 방법은 단순하게 운동을 하면 됩니다. 그러면 귀차니즘이 낮아 지고 운동은 더 자주 하게 되죠. 그럼 아래 그림으로 확장 시킬 수 있겠습니다.
사용자 삽입 이미지

SWT 프로그램 실행하기

참조 : SWT-JFace In Action, SWT Programming with Eclipse

코드는 아래와 같습니다.

public class HelloSWT {
    public static void main(String[] args) {

        Display display = new Display();
        Shell shell = new Shell(display);

        Text helloText = new Text(shell, SWT.CENTER);
        helloText.setText(“Hello SWT!”);
        helloText.pack();

        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();

    }
}

다른 부분은 거의 템플릿 같고 빨간 부분에 뭔가 만들어 주면 될 것 같습니다.

실행을 하려면 아.. 먼저 컴파일 에러를 없애려면 swt.jar 파일이 필요합니다. swt.jar 파일은  여기서[footnote]stable 버젼에서 사용하는 OS 종류를 클릭하시면 됩니다.[/footnote] swt_버전.zip 파일을 다운 받으시면 안에 들어 있습니다. swt.jar 파일을 라이브러리에 추가해 줍니다.

그럼 이제 컴파일 에러는 없어지지만 실행하면 ~~.dll 파일을 못찾겠다고 합니다. 못 찾는 파일은.. zip 파일 안에 들어 있습니다. 그 파일을 현재 프로젝트가 사용중인 JDK or JRE 버젼의 디렉토리 밑에 있는 bin 폴더 안에 복사해서 넣어 주면 됩니다.

사용자 삽입 이미지
이런 앙증맞은 화면이 떳군요.

참조 하면 좋을 것 같은 링크 : http://www.eclipse.org/swt/widgets/

2. 작업 소요 시간 측정

2.1. “작업 시작” 버튼을 클릭 한 시간 부터 “작업 완료” 버튼을 클릭 했을 때 까지의 시간을 잽니다.

이걸 좀 더 잘개 쪼개야 겠습니다. 시간은 초 단위가 좋을 것 같습니다.
2.1.1. “작업 시작” 버튼을 클릭하면 시간을 재기.

    @Test public void getStartTime(){
        int startTime = new Work(“work1”).start();
        assertFalse(startTime == 0);
    }

다음 작업을 하기 전에 startTime을 Work 클래스에 저장해 둬야 할 것 같아졌습니다. 그래야 나중에 작업이 완료 됐을 때 계산할 수 있으니깐요..

2.1.2. startTime 저장하기

    @Test public void getStartTime(){
        Work work = new Work(“work1”);
        work.start();
        assertNotNull(work.getStartTime());
    }

2.1.2. “작업 완료” 버튼을 클릭하면 현재 시간에서 작업 시작 시간을 빼서 소요 시간 구하기.
   
    @Test public void getWorkedTime(){
        Work work = new Work(“work1”);
        work.start();
        long workedTimeInMilli = work.end();
        assertEquals(work.getEndTime() – work.getStartTime(), workedTimeInMilli);
        assertEquals(workedTimeInMilli * 1000, work.getWorkedTime());
    }

2.2. “일시 정지” 버튼을 클릭하면 시간 재는 걸 잠시 중단 합니다. “작업 시작”버튼을 클릭하면 다시 이어서 시간을 잽니다.

이 작업을 구현하려니까 시간을 가지고 테스트 하는게 엄청 불편하게 느껴집니다. start와 end를 할 때 로그 메시지를 기록 하도록 하고 그 메시지를 확인 하도록 테스트를 변경합니다.

    @Test public void pausedTime(){
        Work work = new Work(“work1”);
        work.start();
        work.pause();
        work.reStart();
        long workedTime = work.end();
        assertEquals(“작업 시작 -> 일시 중지 -> 다시 시작 -> 작업 종료”, work.getLog().toString());
        assertEquals((work.pause() – work.start()) + (work.getEndTime() – work.reStart()), workedTime);
    }

2.3. “작업 완료” 버튼을 클릭하면 해당 작업한 시간이 기록됩니다. 이건 이미 위에 것들을 구현하다보니 구현이 되버렸군요.

현재 까지 작업 상황을 보면

– 시작 -> 종료 :: 2.1.
– 시작 -> 일시 정지 -> 다시 시작 -> 종료 :: 2.2.
– 시작 -> 일시 정지 -> 종료
– 시작 -> 일시 정지 -> 다시 시작 -> 일시 정지 -> 다시 시작 -> 종료

미쳐 아래 두 가지 경우 수를 생각 못했었군요.

그리고 작업한 시간을 출력해보니 전부 0으로 나오기 때문에 수치가 정확한지 가늠할 수 있는 뭔가 더 좋은 테스트 방안을 모색해 봐야겠습니다.

테스트를 위해서 log를 만들었지만 이 것이 차후 프로그램에서 필요한가를 생각해보니.. 시간 테스트를 위한 대안이였는데 전혀 적절한 대안이 되진 못한 것이 절 초라하게 만드는군요. ㅠ.ㅠ