대략난감 테스트 자동 생성기 Randoop
http://people.csail.mit.edu/cpacheco/randoop/1.2/doc/userman.php
처음 보고는 이야.. 아주 별에 별 도구가 다 있구나. 생각을 하고 과연.. 잘 만들어 줄까?? 라는 기대반 호기심 반으로 들려봤습니다.
테스트를 작성할 대상이 되는 클래스는 예전에 사부님이 시켜주신 TTD 트레이닝 중 하나 볼링게임. 그 중에서도 Frame이라는 클래스를 마루타 삼기로 햇습니다.
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만 라인씩 생성된다는 겁니다. 이클립스가 막 죽으려고 버버버벅 거립니다.
그 중에서 젤 간단해 보이는 걸 몇 개 보여드릴까요?
대략 난감입니다. 테스트를 돌리면 전부 성공하긴 합니다.
그냥 웃음 밖에 안나옵니다. 크하하하하... 저 수 많은 코드와 녹색불은.. 무슨 의미가 있을까요?