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만 라인씩 생성된다는 겁니다. 이클립스가 막 죽으려고 버버버벅 거립니다.

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


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


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