Whiteship's Note

대략난감 테스트 자동 생성기 Randoop

Good Tools : 2008.11.07 18:01


http://people.csail.mit.edu/cpacheco/randoop/1.2/doc/userman.php

처음 보고는 이야.. 아주 별에 별 도구가 다 있구나. 생각을 하고 과연.. 잘 만들어 줄까?? 라는 기대반 호기심 반으로 들려봤습니다.

테스트를 작성할 대상이 되는 클래스는 예전에 사부님이 시켜주신 TTD 트레이닝 중 하나 볼링게임. 그 중에서도 Frame이라는 클래스를 마루타 삼기로 햇습니다.

package domain;

import java.util.ArrayList;
import java.util.List;

public class Frame {

    List<Roll> rollList = new ArrayList<Roll>();
    protected Integer remainPinNumber = 10;
    private Integer number;

    public Frame(Integer frameNumber) {
        this.number = frameNumber;
    }

    public Boolean isEnd() {
        if (hasStrike() || rollList.size() == 2)
            return true;
        return false;
    }

    protected boolean hasStrike() {
        for (Roll roll : rollList)
            if (roll.getType() == RollType.STRIKE)
                return true;
        return false;
    }

    public void add(Roll roll) {
        setRollType(roll);
        remainPinNumber -= roll.getKnockDownPinCount();
        rollList.add(roll);
    }

    protected void setRollType(Roll roll) {
        Integer knockDownPinCount = roll.getKnockDownPinCount();
        if (rollList.size() == 0 && knockDownPinCount == 10)
            roll.setType(RollType.STRIKE);
        else if (knockDownPinCount == 0)
            roll.setType(RollType.GUTTER);
        else if (knockDownPinCount == remainPinNumber)
            roll.setType(RollType.SPARE);
    }

    public Integer getRollListSize() {
        return rollList.size();
    }

    public Integer getRemainPinNumber() {
        return remainPinNumber;
    }

    public Integer getScore() {
        Integer score = 0;
        for (Roll roll : rollList)
            score += roll.getScore();
        return score;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder("frame(");
        builder.append(number).append(", ");
        for (Roll roll : rollList)
            builder.append(roll.toString());
        builder.append(", ").append(getScore()).append(")");
        return builder.toString();
    }

    public List<Roll> getRollList() {
        return rollList;
    }

}
 
그리 복잡한 클래스는 아니지만 비즈니스 로직이 들어있죠. 저걸 대상으로 테스트 코드를 생성해봤습니다.

10초 동안 돌려서 만들어 봤습니다. 콘솔에 뭔가가 찍히는데 무슨 의미인지는 모르겠고 마지막에 생성된 파일 목록이 나오는데 다섯개나 만들어져있습니다.


저 중에서 RandoopTest.java는 테스트 스위트 파일이고 네 개의 소스 파일이 테스트 코드를 담고 있습니다.

문제는... 대체 뭘 테스트 한 건지도 모르겠는 코드가 14000~2만 라인씩 생성된다는 겁니다. 이클립스가 막 죽으려고 버버버벅 거립니다.

그 중에서 젤 간단해 보이는 걸 몇 개 보여드릴까요?


대략 난감입니다. 테스트를 돌리면 전부 성공하긴 합니다.


그냥 웃음 밖에 안나옵니다. 크하하하하... 저 수 많은 코드와 녹색불은.. 무슨 의미가 있을까요?


top

  1. Favicon of http://pragmatic.kr BlogIcon 김성안 2008.11.07 20:10 PERM. MOD/DEL REPLY

    이 도구는 처음 보지만 테스트 자동 생성은 의미(semantic)을 파악할 수 없기 때문에 대부분 커버리지를 높이는 목적으로 데이터를 자동생성하면서, 경계값 테스트라던지 테스팅 이론에 나오는 부분에 집중 합니다.

    이게 자바에서는 상당히 별 의미 없고 노력에 비해 얻는게 적은데 하드웨어 쪽이나 이런데 내려가면 중요한 얘기가 되더라고요.

    아니면 제출용 자료에서 테스트 커버리지를 요구할 때 살짝 이용해도 되겠군요.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.11.07 22:13 PERM MOD/DEL

    네.. 저는 하드웨어쪽은 전혀 모르기 때문에 어떨지 몰겠습니다. 제가 아는 선에서는 저 툴을 이용해서 어떤 긍정적인 효과를 볼 수 있을지는 잘 상상이 안 되네요. ^^;

  2. Favicon of http://toby.epril.com BlogIcon 토비 2008.11.07 21:18 PERM. MOD/DEL REPLY

    흠... 무작정 높은 커버리지만 요구하는 데서 살짝쿵 써먹을 수 있겠네.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.11.07 22:15 PERM MOD/DEL

    네;; 허허헐... 피상성을 중요시 한다면 그럴 수 있겠네요.

Write a comment.




: 1 : ··· : 712 : 713 : 714 : 715 : 716 : 717 : 718 : 719 : 720 : ··· : 2638 :