Whiteship's Note

테스트는 진짜로 잘 만들어야 함

모하니?/Coding : 2008.04.25 22:51


오늘 테스트를 "제대로" 만들어야 함을 배웠습니다. 개발하고 배우고 느끼고 공부하고 혼나고 가끔 이렇게 공유도 하고 재밌습니다.

제가 만든 클래스는 제네릭 프로퍼티 에디터로, 특정 객체 타입이 오면 해당 객체가 가지고 있는 id 값을 화면에 보여주기 위한 클래스입니다. 즉 ${member} 라고 JSP에 적어두면 member 객체의 id를 사용합니다.

구현도 잘 했고, 테스트도 잘 했다고 생각해서 기분이 좋았었습니다. 그런데 이게 왠걸.. 실제로 돌아가는걸 보니까 잘 안 되는 것입니다. 제가 만든건 GenericPropertyEditor 입니다. 코드는 공개 안 하려고 했지만 어쩔 수 없네요.ㅋㅋ

아래가 구현한 코드입니다.
    public String getAsText() {
        T entity = (T) this.getValue();
        logger.info("entity = " + entity);
        if (entity == null)
            return "";
        else
            return String.valueOf(SimpleReflectionUtils.getValue(entityClass, entity, "id"));
    }

저걸 테스트 해보려고 다음과 같은 코드를 작성했습니다.
    @Test
    public void getAsText() throws Exception {
        Supp supp = new Supp();
        int id = 10;
        supp.setId(id);
       
        suppPropertyEditor.setValue(supp);
       
        assertEquals(String.valueOf(id), suppPropertyEditor.getAsText());
    }

잘 돌아갑니다.

그런데 분명 위의 코드에는 문제가 있습니다. 무슨 문제인지는 비밀입니다. 스프링, 하이버, @ManyToOne,Lazy Initialization, Proxy, id, getter, field 등을 조합해서 생각하면 문제를 발견하실 수도 있으실 테지만, 전 상상도 못했었습니다.

테스트를 기계적으로 만들지 말고 해당 클래스가 어떤 상황에서 어떤 역할을 하는지 고려해서 작성해야 한다는 걸 느꼈습니다.
top

TAG
  1. Favicon of http://songsungkyun.cafe24.com BlogIcon songsungkyun 2008.04.26 08:32 PERM. MOD/DEL REPLY

    몇달간 rss 구독하다가 처음으로 포스트하네요.

    SimpleReflectionUtils.getValue(entityClass, entity, "id";));
    이 내용이 없으면 도저히 알 수가 없네요. 저에게는

    그런데 정말 열심히 하시는것 같습니다.
    영어도 잘하시구..

    저도 한때 테스트에 쏘옥 빠졌는데
    정말 장난아니더라구요.
    비지니스 로직까지는 아니지만
    그 정도의 양의 코딩이 나오고
    관점 자체가 틀려서 새로운 클래스에
    새로운 메서드를 많이 만들었습니다.

    그리고 저는 단위테스트가 아니고(단위테스트도 일부 들어가고)
    약간 업무 단위 테스트에 가깝게 작성을 했었습니다.
    이상적인 TDD는 아니였습니다.
    다른 시스템가 인터페이스가 좀 들어간거라
    설정을 잘못하면 테스트하다가 시스템에 문제를
    일어키겠구나 싶더라구. 그래도 좋은 경험이였던것
    같습니다.
    최근에 제가 느낀 가장 혁신적인? 것이 TDD였거던요.

    항상 좋은 글 감사하구요.
    그런데 행복한 개발자님과 관심분야가
    저와 조금 틀려서 많이 피부에 와닿지는 않지만
    제목정도 보는 것도 피와 살이
    될 것 같습니다.

    즐거운 주말 보내세요~~

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.04.26 09:46 신고 PERM MOD/DEL

    우와.. 제 블로그에 달린 가장 긴 댓글입니다.

    SimpleReflectionUtils의 getValue는 해당 클래스의 "id"라는 멤버 변수의 값을 가져다 줍니다. 변수에 직접 접근하여 그 값을 가져오죠.

    저 코드에 문제가 있지는 않고 저런 방식에는 문제가 있습니다. id 값을 필드에서 바로 가져오면 안 되고 getter를 거쳐서 가져와야 했습니다.(그 이유는 역시 비밀입니다.ㅋㅋ) 그래서 결국 SRU 클래스에 callMethod(Class, Object, String methodName) 이라는 메소드를 하나 추가해서 해결했습니다.

    전 영어도 잘 못하고 TDD는 더 못합니다.ㅋㅋ 위의 코드도 일단 구현부터 하고 테스트를 작성했을 정도지요.

    막상 테스트를 작성해보면 "단위 테스트"라는 것에 얽매여서 위와 같은 코드를 작성하기가 쉽상인데, 저 위에 작성한 테스트 코드는 정말 정말 아무런 의미가 없는 테스트입니다. 단위 테스트 중독자들에겐 의미가 있을 수도 있지만 개발자 또는 애플리케이션에겐 아무런 의미가 없습니다. 마치 동문서답 같은 테스트죠. A를 할 수 있느냐? 락 물었더니 어 B는 할 수 있어. 정도의 테스트죠.

    제대로 "개발자 테스트"를 작성하려면 위의 테스트 코드는 CGLib으로 만든 프록시 객체를 사용했어야 합니다.

    댓글 감사합니다. 주말 재밌게 보내세요~

Write a comment.




: 1 : ··· : 197 : 198 : 199 : 200 : 201 : 202 : 203 : 204 : 205 : ··· : 299 :