Arbitrary를 활용한 커스터마이징

Jqwik은 JVM 환경에서 사용할 수 있는 프로퍼티 기반 테스트 라이브러리입니다. Fixture Monkey는 문자, 문자열, 정수 등의 기본 타입에 대한 랜덤 값을 생성하기 위해 Jqwik의 Arbitrary를 사용합니다.

Jqwik에서 Arbitrary는 생성(Generating) 및 축소(Shrinking)할 수 있는 객체를 나타내는 핵심 인터페이스입니다. 때때로 픽스처 프로퍼티가 특정 제약 조건을 준수하면서 랜덤 값을 가지도록 원할 수 있습니다.

이러한 경우에는 Fixture Monkey의 set() 메서드로 프로퍼티의 값을 Arbitrary로 할당하여 랜덤 값을 가지도록 할 수 있습니다. Jqwik의 Arbitraries 클래스의 정적 메서드를 호출하여 특정 조건을 충족하는 Arbitrary를 생성할 수 있습니다.

다음 코드 예제는 Arbitrary를 사용하여 set()을 통해 랜덤 값을 커스터마이징하는 방법을 보여줍니다:

Product actual = fixtureMonkey.giveMeBuilder(Product.class)
    .set("id", Arbitraries.longs().greaterOrEqual(1000))
    .set("productName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(10))
    .set("productType", Arbitraries.of(ProductType.CLOTHING, ProductType.ELECTRONICS))
    .sample();

then(actual.getId()).isGreaterThanOrEqualTo(1000);
then(actual.getProductName()).matches("^[a-z]+$");
then(actual.getProductName().length()).isLessThanOrEqualTo(10);
then(actual.getProductType()).matches(it -> it == ProductType.CLOTHING || it == ProductType.ELECTRONICS);
val actual = fixtureMonkey.giveMeBuilder<Product>()
    .setExp(Product::id, Arbitraries.longs().greaterOrEqual(1000))
    .setExp(Product::productName, Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(10))
    .setExp(Product::productType, Arbitraries.of(ProductType.CLOTHING, ProductType.ELECTRONICS))
    .sample()

then(actual.id).isGreaterThanOrEqualTo(1000)
then(actual.productName).matches("^[a-z]+$")
then(actual.productName.length).isLessThanOrEqualTo(10)
then(actual.productType).matches { it -> it === ProductType.CLOTHING || it === ProductType.ELECTRONICS }

Jqwik 사용자 가이드에서 Arbitrary에 대한 자세한 내용을 확인하세요.