TestCode

FixtureMonkey 알아보기

누구세연 2024. 3. 26. 21:08

사이드 프로젝트를 진행하며 테스트 코드에 중복되는 부분이나 재사용을 위해 고민하다 FixtureMonkey를 접하게 되어 알아보겠습니다.

 

 

FixtureMonkey ?_?

테스트 데이터 생성 및 관리를 위한 도구로, 테스트 코드 작성 시 반복되는 부분을 최소화하고 테스트 데이터를 쉽게 생성할 수 있도록 도와주는 라이브러리입니다. 일반적으로 테스트 코드 작성 시에 필요한 여러 객체나 데이터를 무작위로 생성하여 테스트에 사용할 수 있습니다.

 

FixtureMonkey  활용

FixtureMonkey 사용하기 전

@Test
void testCalculateTotalPrice() {
    // Given
    Product 카메라 = new Product();
    카메라.setName("Camera");
    카메라.setPrice(1000);

    Product 휴대폰 = new Product();
    휴대폰.setName("Smartphone");
    휴대폰.setPrice(500);

    ShoppingCart shoppingCart = new ShoppingCart();
    shoppingCart.addProduct(휴대폰);
    shoppingCart.addProduct(카메라);

    // When
    int totalPrice = shoppingCart.calculateTotalPrice();

    // Then
    assertEquals(1500, totalPrice);
}

FixtureMonkey 사용한 후

@Test
void testCalculateTotalPrice() {
    // Given
    FixtureMonkey fixtureMonkey = FixtureMonkey.create();

    Product 카메라 = fixtureMonkey.giveMeBuilder(Product.class)
                                  .set("name", "Camera")
                                  .set("price", 1000)
                                  .sample();

    Product 휴대폰 = fixtureMonkey.giveMeBuilder(Product.class)
                                  .set("name", "Smartphone")
                                  .set("price", 500)
                                  .sample();

    ShoppingCart shoppingCart = new ShoppingCart();
    shoppingCart.addProduct(카메라);
    shoppingCart.addProduct(휴대폰);

    // When
    int totalPrice = shoppingCart.calculateTotalPrice();

    // Then
    assertEquals(1500, totalPrice);
}

사용하기전에는 각각의 Product 객체를 수동으로 생성해야 했습니다.

그러나 FixtureMonkey를 사용한 후에는 필요한 속성을 갖춘 객체를 간단하게 생성할 수 있습니다.

이렇게 하면 코드를 한 줄로 작성하여 가독성이 향상되고 테스트 데이터를 한 곳에서 관리할 수 있어 유지보수가 용이해집니다.

 

FixtureMonkey 장단점

장점

  • 빠른 테스트 데이터 생성
  • 테스트 데이터의 재사용성
  • 복잡한 객체 생성 지원
  • 테스트 데이터의 일관성 보장

단점

  • 데이터 신뢰성의 문제
    FixtureMonkey를 사용하여 생성된 데이터가 실제 운영 환경에서 발생할 수 있는 데이터와 일치하지 않을 수 있습니다. 이는 가끔씩 테스트 시나리오에 대해 완전히 정확한 데이터를 생성하기 어려울 수 있다는 점을 의미합니다.
  • 지나친 의존성
    FixtureMonkey의 변경이 테스트 코드에 큰 영향을 줄 수 있습니다. 따라서 적절한 사용 방법을 고려해야 합니다.
  • 사용자의 미숙한 사용
    FixtureMonkey를 올바르게 사용하지 않으면 테스트 코드의 가독성과 유지 보수성이 저하될 수 있습니다. 특히 복잡한 테스트 시나리오에서는 FixtureMonkey를 적절하게 활용하는 것이 중요합니다.

이러한 장단점들을 고려하여 FixtureMonkey를 사용할 때 장점을 최대한 활용하고, 단점을 극복하기 위한 적절한 접근 방법을 고려하는 것이 중요할 것 같습니다.

 

FixtureMonkey 사용방법

1. 의존성 추가

testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.14")

 

2. FixtureMonkey 인스턴스 생성

FixtureMonkey를 사용하기 위해 FixtureMonkey 인스턴스를 생성합니다. 이때 생성 전략을 지정할 수 있습니다.

FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
        .build();

아래의 생성 전략 중에서 가장 적합한 것을 선택하여 FixtureMonkey 인스턴스를 생성할 수 있습니다.

 

FixtureMonkey 주요 생성 전략

  • BeanArbitraryIntrospector
    기본 생성 전략입니다.
    클래스가 파라미터가 없는 빈 생성자를 가져야 합니다.
    클래스에 setter 메서드가 존재해야 합니다.
    대부분의 경우, 클래스에 Lombok의 @Value 또는 @Data 애노테이션을 사용할 때 유용합니다.
  • ConstructorPropertiesArbitraryIntrospector
    클래스에 @ConstructorProperties 애노테이션이 있는 생성자를 사용하여 객체를 생성합니다.
    주로 Java 9 이전의 버전에서 사용되는 경우가 많습니다.
  • FieldReflectionArbitraryGenerator
    클래스의 필드를 사용하여 객체를 생성합니다.
    클래스에 필드가 있어야 하며, getter 및 setter가 필요하지 않습니다.
    대부분의 경우에 사용할 수 있지만, Lombok의 @Data 또는 @Value 애노테이션이 적용된 클래스에 특히 유용합니다.
  • ExternalObjectArbitraryGenerator
    외부에서 제공되는 객체를 사용하여 생성합니다.
    주로 외부 API와 통합하여 데이터를 가져오는 경우에 사용됩니다.

 

또는 간단히 아래와 같이 생성할 수도 있습니다.

FixtureMonkey fixtureMonkey = FixtureMonkey.create();

기본적으로 BeanArbitraryIntrospector를 사용하여 객체를 생성하며, 이를 위해서는 클래스가 파라미터가 없는 빈 생성자를 가지고 있어야 합니다.

 

3. 데이터 생성

FixtureMonkey를 사용하여 필요한 데이터를 생성합니다. 여러 방법이 있으며, 주요한 방법들은 다음과 같습니다.

객체 생성하기 (기본 생성자를 사용하여 객체를 생성)

클래스에 파라미터가 없는 기본 생성자를 사용하여 무작위로 생성된 객체를 반환합니다.

User user = fixtureMonkey.giveMe(User.class).sample();

 

필드 값을 설정할 수 있는 객체 생성하기

빌더를 사용하여 필드 값을 설정할 수 있습니다.

User user = fixtureMonkey.giveMeBuilder(User.class)
        .set("id", 1)
        .set("username", "seyeon")
        .set("email", "seyeon@example.com")
        .sample();

 

지정된 클래스의 객체 리스트를 생성하기

리스트의 크기와 각 요소의 값이 무작위로 생성됩니다.

List<User> users = fixtureMonkey.giveMeListOf(User.class, 5).sample();

 

위와 같은 방법으로 FixtureMonkey를 사용하여 데이터를 생성하고, 테스트 코드나 다른 곳에서 활용할 수 있습니다.

 

 

FixtureMonkey는 테스트 코드의 가독성을 높이고 유지보수성을 개선할 수 있습니다. 또한 중복을 줄일 수 있어서 코드의 일관성을 유지하는데 도움이 됩니다. 

하지만 과도한 FixtureMonkey의 사용은 테스트 코드의 가독성을 해칠 수 있고 테스트의 목적을 흐려질 수 있습니다.

따라서 필요한 경우에만 적절히 사용하는 것이 좋을 것 같습니다!_!

더 상세한 정보는 아래의 공식문서를 확인해보시는걸 추천드립니다.

 

 

 

https://github.com/naver/fixture-monkey

'TestCode' 카테고리의 다른 글

JUnit4와 JUnit5의 차이  (1) 2025.01.27
인수 테스트 격리하는 방법  (0) 2024.07.06
단위 테스트 vs 통합 테스트 vs 인수테스트  (1) 2024.02.10