Java로 Property-Based testing 그 1 [JPopulator + Junit]

3678 단어 JUnittest자바
테스트 도구 AdventCalendar 2015 11일째 기사입니다.
하루 늦어서 죄송합니다.

소개



요 전날 랜덤 데이터를 만들어 테스트하고 싶은 경우가 있어 랜덤 데이터 생성이나 Property-based testing의 라이브러리를 찾았습니다.
거기서 찾아낸 jPopulator가 간단하게 사용할 수 있어 편리할 것 같았기 때문에 소개하려고 생각합니다.

사용법



우선 가장 간단한 사용법입니다.
Populator generator = new PopulatorBuilder().build();
generator.populateBean(Person.class);

populateBean 메소드의 인수에 지정된 클래스의 데이터를 자동으로 생성할 수 있습니다.
다른 프레임워크에 의존하지 않고, 단지 이것만의 설명으로 랜덤 데이터를 생성할 수 있습니다.
또, 필드에 클래스가 있는 경우도 자동적으로 그 클래스내의 필드도 랜덤 데이터로 메워 줍니다.

평상시 테스트할 때, 사실은 가능한 한 현실에서 사용되는 데이터에 가까운 데이터를 준비하고 싶은데, 필요 최소한으로 끝나는 것이 많을까 생각합니다.
간단하게 기술할 수 있으므로, 테스트의 시인성을 낮추지 않고, 중요도가 낮다고 생각하고 있는 필드에도 우선 값을 채워 둔다고 할 수 있습니다.

생성 데이터 제어



생성 데이터를 조정할 수도 있습니다.

필드를 제외하고 생성


generator.populateBean(Person.class, "age");

지정된 수의 인스턴스를 함께 작성


generator.populateBeans(Person.class, 100);

무작위 수의 인스턴스를 함께 생성


generator.populateBeans(Person.class);

생성되는 데이터의 변형을 변경합니다.



Randomizer 인터페이스를 구현함으로써 생성 데이터의 내용도 자유롭게 커스터마이즈 할 수 있습니다.
public class AgeRandomizer implements Randomizer<Integer> {
    @Override
    public Integer getRandomValue() {
        return ((Double) (Math.random() * 50)).intValue();
    }
}

Randomizer는 SAM Type이지만 물론 람다 식으로 쓸 수 있습니다.
Populator generator = new PopulatorBuilder()
                .registerRandomizer(Person.class, Integer.class, "age", () -> ((Double) (Math.random() * 50)).intValue())
                .build();
}

기성의 Randomizer도 몇 가지 준비되어 있으므로 편리하게 사용할 수 있다고 생각합니다.

기성의 Randomizer


Randomizer의 사용 예
Populator generator = new PopulatorBuilder()
                .registerRandomizer(Person.class, String.class, "name", new FirstNameRandomizer())
                .build();

마지막으로 테스트에 대한 응용 예로서 JUnit의 DataPoints를 이용하여 테스트를위한 랜덤 데이터를 생성하는 코드를 소개합니다.
import org.junit.contrib.theories.DataPoints;
import org.junit.contrib.theories.Theories;
import org.junit.contrib.theories.Theory;
import org.junit.runner.RunWith;

import io.github.benas.jpopulator.api.Populator;
import io.github.benas.jpopulator.impl.PopulatorBuilder;
import io.github.benas.jpopulator.randomizers.CityRandomizer;
import io.github.benas.jpopulator.randomizers.FirstNameRandomizer;

@RunWith(Theories.class)
public class UseJpopulator {
    @DataPoints
    public static Person[] getParameters() {
        Populator generator =
            new PopulatorBuilder()
                .registerRandomizer(Person.class, String.class, "name", new FirstNameRandomizer())
                .registerRandomizer(Person.class, Integer.class, "age", () -> ((Double) (Math.random() * 50)).intValue())
                .registerRandomizer(Address.class, String.class, "city", new CityRandomizer())
                .build();
        return generator.populateBeans(Person.class, 100).toArray(new Person[0]);
    }
    @Theory
    public void XXX(Person p) {
        // TODO some tests
    }
}

생성 결과


오늘은 이상입니다.

다음은 Junit-Quickcheck에 대해 쓸 것입니다.

좋은 웹페이지 즐겨찾기