LoginSignup
5
2

More than 5 years have passed since last update.

java用PropertyBaseTestingツールEasyRamdomを試す

Posted at

EasyRamdomはJavaのインスタンスをランダムに作ってくれるツール。Property Base Testingツールの一種です。

特徴はこんな感じ
- getter/setter/デフォルトコンストラクタがなくても生成可能(自分はgroovyのspockで試しました。spockでは不要でした。JUnitとかだと試していないです。念の為。)
- 型に合わせてデータを作ってくれる
- 複雑な型もOK
- とにかくシンプル
- 生成方法は柔軟に変更可能
- EnumはEnumの値からランダムで選択してくれる
- BeanValidationと併用するとValidationの制限値内でデータを作ってくれる

結構自分的には理想的なツールです。

dependenciesは一つだけ。
BeanValidationを使用する場合はeasy-random-bean-validationも。

dependencies{
    testCompile "org.jeasy:easy-random-core:4.0.0.RC1"
    testCompile "org.jeasy:easy-random-bean-validation:4.0.0.RC1"
}

基本

EasyRandom easyRandom = new EasyRandom()
Quantity quantity = easyRandom.nextObject(Quantity.class)

これだけでQuantityオブジェクトが生成されます。
Quantityの中身がどうあれ型に合わせて作ってくれます。

seedは固定のようなので基本毎回同じ値を返してします。なので、seedを指定することをおすすめします。

EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)

生成方法を変更する

Randomizerを作成すると自由に生成方法を変更できます。以下の例は(令和!?)1〜1000の範囲内で生成するようにしています。

EasyRamdomでbuildinのRandomizerもあって、名前や郵便番号などを生成してくれるものらしいです。内部でfakerというツールを使用しているみたいです。
Localeも指定できるようなので、日本語の名前や住所なんかも生成できそう。まだ試してないけど。
使用にはeasy-random-randomizersをdependenciseに追加する必要があります。

QuantityRandmizer.java
public class QuantityRandmizer implements Randomizer<Integer>
{
    @Override
    public Integer getRandomValue()
    {
        return ThreadLocalRandom.current().nextInt(1, 1000 + 1);
    }
}
EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
                .randomize(FieldPredicates.named("value")
                .and(FieldPredicates.ofType(Integer.class))
                .and(FieldPredicates.inClass(Quantity.class)), new QuantityRandmizer())

EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)

BeanValidationとともに使用

BeanValidationの範囲内で生成することもできます。
以下の例では、100から1000の範囲内で生成されます。

Quantity.java
public class Quantity
{
    @Min(100)
    @Max(1000)
    Integer value;

    public Quantity(Integer value)
    {
        this.value = value;
    }
}
EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)

素晴らしい!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2