๋ฐ˜์‘ํ˜•

๐Ÿ”น Fixture Monkey

* ๊ณต์‹ ๊นƒํ—™ : https://github.com/naver/fixture-monkey

* ๊ณต์‹ ํ™ˆํ”ผ: https://naver.github.io/fixture-monkey/

 

Fixture Monkey

 

naver.github.io

๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์ •์‹ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ๋‹ค๊ณ  ํ•˜์—ฌ ํ•œ๋ฒˆ ์ฐ๋จนํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (๋ธ”๋กœ๊ทธ ๋งํฌ)

์šฐ์„  ๊ณต์‹ ํ™ˆํ”ผ์—์„œ ์„ค๋ช…์„ ํ•œ๋ฒˆ ์ฝ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. 

Fixture Monkey๋Š” ์ œ์–ด ๊ฐ€๋Šฅํ•œ ์ž„์˜์˜ ํ…Œ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋œ Java ๋ฐ Kotlin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ๊ฐ„์†Œํ™”ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋ฅผ ๋‹ค๋ฃจ๋“  ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋ฅผ ๋‹ค๋ฃจ๋“ , Fixture Monkey๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ๊ฐœ์ฒด๋ฅผ ์†์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์›ํ•˜๋Š” ๊ตฌ์„ฑ์— ๋งž๊ฒŒ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Fixture Monkey๋กœ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ JVM ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

 

 

 

๐Ÿ”น ๊ณต์‹ ๋ฌธ์„œ Getting started ๋”ฐ๋ผ ํ•˜๊ธฐ

์ผ๋‹จ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•„์š”์กฐ๊ฑด

  • JDK 1.8 or higher (Or Kotlin 1.8 or higher)
  • JUnit 5 platform
  • jqwik 1.7.3

์ด๋Ÿฐ ๊ฒŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” JDK 17์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import

#### Gradle ####
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.0")

#### Maven ####
<dependency>
  <groupId>com.navercorp.fixturemonkey</groupId>
  <artifactId>fixture-monkey-starter</artifactId>
  <version>1.0.0</version>
  <scope>test</scope>
</dependency>

์ €๋Š” gradle์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

naver ์ฝ”๋“œ๊ฐ€ ๋‚ด ํ”„๋กœ์ ํŠธ์— ์žˆ๋‹ค๋‹ˆ ๊ธฐ๋ถ„์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

2. ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

import lombok.Value;

import java.time.Instant;
import java.util.List;

@Value
public class Book {
    Long id;
    String name;
    Integer price;
    List<String> authors;
    Instant createdAt;
}

์ด๋Ÿฐ์ €๋Ÿฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋กฌ๋ณต์ด ์—†๋‹ค๋ฉด ์˜†์— ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. (๋งํฌ)

 

3. ์ผ๋ฐ˜์ (?)์œผ๋กœ ํ…Œ์ŠคํŠธ

import static org.junit.jupiter.api.Assertions.assertEquals;

public class NormalTest {
    @Test
    void normalTest() {
        // given
        Long expectedId = 1L;
        String expectedName = "ํ…Œ์ŠคํŠธ ์ฑ…";
        Integer expectedPrice = 10000;
        List<String> expectedAuthors = Arrays.asList("์ž‘๊ฐ€1", "์ž‘๊ฐ€2");
        Instant expectedCreatedAt = Instant.now();

        // when
        Book book = new Book(expectedId, expectedName, expectedPrice, expectedAuthors, expectedCreatedAt);

        // then
        assertEquals(expectedId, book.getId());
        assertEquals(expectedName, book.getName());
        assertEquals(expectedPrice, book.getPrice());
        assertEquals(expectedAuthors, book.getAuthors());
        assertEquals(expectedCreatedAt, book.getCreatedAt());
    }
}

์œ„์—์„œ ๋งŒ๋“  Book์„ ํ…Œ์ŠคํŠธํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ž˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

4. ์ด์ œ Fixture Monkey๋ฅผ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธํ•ด ๋ด…์‹œ๋‹ค.

public class FixtureMonkeyTest {
    @Test
    void fixtureMonkeyTest() {
        // given
        FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
                .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
                .build();

        // when
        Book book = fixtureMonkey.giveMeOne(Book.class);

        // then
        assertNotNull(book.getId());
        assertNotNull(book.getName());
        assertNotNull(book.getPrice());
        assertNotNull(book.getAuthors());
        assertNotNull(book.getCreatedAt());


        System.out.println(book);
    }
}

์ž˜ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋‚˜ ๊ถ๊ธˆํ•ด์„œ print๋ฅผ ์ฐ์–ด๋ดค๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

-- Try 1
Book(id=325, name=ไธ˜ๆพญโจ€เฅฒ์ฝ˜๋บฝๆน…โ•‡ๆŸบํˆฒ๋Šฉ้ขทไคจใ‚้ตฟ๏บ‹แ“ช้ฝคไฅฑํ“ต, price=3060, authors=[ใฆ้ฉขๆ›‡้งˆ๏ฉœ็ฃ“เซ‘่ฐ”๋‹›ๆญค่›ช้ššํ—Ž์งฆๅพๅฐ€๋ˆฅๅฝƒๆทฎ๊งฉไฌ•ๅ–ใ˜งๅ˜–็ผƒ์ฃแšธํ‘ƒ็ƒ์ตก่€ฃีฒใดŠแฝต่ฏœ่ฉฝ่ซงไœฌ์Žๆพ›๊“Šใ†•่ฝŒๆก€โ€…่ฅฝ์ˆผแผนแด‡ไ›ฟโฐถ๏นต์ญˆไŸŽๆฃœΞ็นง๋คญ๏ถฑ์คทแ–คๆฃ…์พ‚แŸƒโƒžแ•ผ๊“ฆ์ƒ”่คžๆผจแ…žไฑˆ์…‰่˜ๆณ€็ฟ‚ํ“ผโบ™๏ฒไจž๋…จ฿™ไžผ, ๏ฅปแพœโƒงๅ—œใฑ้ดจโฅ๊ฟทแ“ทใŽŒ๊ฌŽ๋ฏตโถพโ‘ฒ๊™ก], createdAt=2023-07-19T10:02:25.892613591Z)
-- Try 2
Book(id=3983871, name=๊‰—่–ผ์‹็•ฒ์ดฌๆธžๅฝ„ใ‡ ้กค๋ฑฐใฑฌสฆใ‡พ็บšใกช้ฌโ‡ทโ€ถ็งต๊‚ต๊ŠตๅŠ ๆ‚พ่•‰๊จ†็ก่•Šๅทด, price=871, authors=[แ•‡้จทใชฟๆ•ฌหไท–๊นนํš’ๅ‚œใ ฑ็ถถ่ˆฅๅถซ็ฏŠ๊คนแ‰งๆฅƒ๋ฉ‚๋ทŠ์ถธ็ฆ๏ฐ ์‚˜โœ„, แฆžแ†ƒ๋•“ๅฒด์‡ƒ่ญฒฤงเจฝเดฎ็Ÿ“็€ตๆฆ้˜—ใœŸไ„ƒ, ์ทใธšํŠต], createdAt=2024-10-04T04:54:25.860969102Z)

๋ญ”๊ฐ€ ์—„์ฒญ๋‚œ๊ฒŒ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์ธ์ฝ”๋”ฉ๋„ ์ข€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด๋ณด์ด๋„ค์š”. ๋ญ ์–ด์จŒ๋“  ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ๋Œ€์‘๋˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™์•„ ๋“ ๋“ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ข…์ข… Test๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. null์ด ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ฐ์ฒด์— NotNull์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„ Monkey๊ฐ€ null ๊ฐ’๋„ ๋„ฃ์–ด์ฃผ๋‚˜ ๋ด…๋‹ˆ๋‹ค. 10๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ๋Œ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„ ์ด๊ฒŒ ๋งž์ง€ ์‹ถ์–ด์„œ ๋‹ค์‹œ @NotNull์„ ๋„ฃ๊ณ  ํ…Œ์ŠคํŠธ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

5. Book ๊ฐ์ฒด ์ˆ˜์ • ํ›„ ๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ (NotNull)

์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Value
public class Book {
    @NotNull
    Long id;
    @NotNull
    String name;
    @NotNull
    Integer price;
    @NotNull
    List<String> authors;
    @NotNull
    Instant createdAt;
}

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ 10๋ฒˆ ๋Œ๋ ค๋ด…๋‹ˆ๋‹ค.

 

์•„์ฃผ ์ด์œ ์ดˆ๋ก๋ถˆ์ด ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. print๋œ ๊ฒฐ๊ณผ๋ฌผ๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ด์ƒํ•œ ์• ๋“ค์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”น ๊ฒฐ๋ก 

๊ฐ์ฒด์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋‹ค์–‘ํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํ…Œ์ŠคํŠธ ๊ฐ์ฒด ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด๋‹ˆ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€์ด๋“œ๋„ ์žˆ๊ณ , ์›ํ•˜๋Š” ์กฐ๊ฑด์„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์„ค๋ช…๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

`๊ฐ์ฒด๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ, ํŠน์ • ์†์„ฑ์€ ์–ด๋–ค ๊ฐ’ ์ค‘์—์„œ ํ•˜๋‚˜๋ฅผ ๋„ฃ์–ด์ค˜.` ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์ปค์Šคํ…€์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๊ณผ ์˜ต์…˜์ด ์žˆ๊ณ , ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์„ค๋ช…๋„ ์ž์„ธํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ๊ฐ€ ๊ธธ์ง€ ์•Š์œผ๋‹ˆ ์‚ฌ์šฉํ•˜๊ธฐ์ „์— ์ถฉ๋ถ„ํžˆ ์ฝ์–ด๋ณด๊ณ  ์“ฐ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ดœ์ฐฎ๋‹ค ์‹ถ์œผ๋ฉด ํšŒ์‚ฌ์— ๋“ค๊ณ ๊ฐ€์„œ ์จ๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

BELATED ARTICLES

more