[Fixture Monkey] 원숭이야, 테스트 값 좀 만들어 줘!

테스트 코드를 작성하는데, 테스트에 필요한 데이터들을 일일히 넣어줘야 해서 이 부분을 어떻게 편리하게 할 수 있을까 찾아보다가 네이버에서 만든 오픈소스인 Fixture Monkey라는 것을 알게 되었습니다.

Fixture Monkey는 제멋대로인 원숭이여서 아무 값이나 만들어서 쥐어줍니다.

09:51:28.111 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 뗀ᢕ葁ᥒ밵ꛓ槽鰘˧꤭ᢢ⣋킨ᬤ舝᎖ꆤ矨빻珿盅꯿䔮돧ꭢ輑鲱㾏늌⾷嬬쮋헖ⅉ꼐솓魜벷쓯佼ῲ쇼鱯쏮꜉⹹䝤逾쏑Ŕ㣪꫕ㄲ鷙坪▊憵諜㗑게펳焌郡ᘚ叜槨第錙쒳➐❽铿鼡㤯䣾咱￰艘ኂ쩡뺔▊灅፦䚙ﭲ귑맅巺쾄娣扟쮒獵ᆈ橊ᥒພꠟ崐ὅ흐癦ವ傎み༚픴脟짻卝䐆罯槤晪溘頣㢾Ȫ⳶뜓恕鉫ḏႺ㨥⭀倕ꃖ墶鿻匶䄘鈒〷豚䕾ݹ䔄བ煐⴪覎낹Ȭ䡚薄낟-肽뗛玎넉㥿쩯椥ꏻㆋ⪃㷇垅뭩볓䏬㊥○㯑鞌驫挘돲麋ꟓ瓏곎轫簛艄럆꿱훐懔౱淑ᣑ꒘ﯺ橅ョ旮翰㒙ꅺ콶ᬇ龣蹖䂪삋蚴缘第洁Ŭ≚⫊ᔃ궸㧑쀥㘦擔䦵쑌嶞兓舃藩ﺿޏ䙥ꑖ熉诛ꖨ➼⽹㏣疜Ԉ蒱䳈浺䋁漢稐献碖튽緕㈞讷︜沎캒枹㤂㮴猞㳺饆⃿윧⾵퐦
09:51:28.186 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 鲳璆⃱殚휗㥯铦巎鑕﯏亖槐䰣햔셂票쎤靂♾杆ℌ鉾㿼馣k⹢鼕ᬣף৥
09:51:28.196 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - ㎧Ꝙ᳔ᄚ좍搥䂼䀌膣獇嵵譴⏩䧰롪⢛獖﯒瞞䑘帾护㔳ꆵ⩜딘필਋嬭퓣殮퀤
09:51:28.212 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 瑷詒₲惫쓒ڭ퇏⫱ᥐ墸톏砕谔
09:51:28.232 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 缬時퍞Ɀ놆ꁇᯄ兽魬⍨ꚫ舔纠柱쭕这꿣⏦䣮泋蒏鰝脋ꀈ发ѩ┊馸
09:51:28.253 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 컘匫㲃䃿癱묁ໄ횇陣띗䭜鵪浖㶵쥦甿랝譤洣
09:51:28.295 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 棍薇庄ᙁ襹塆㵁땡׉踸슱叼싒긯椊ퟌ俊簇⚹�㌬ƀ쯰
09:51:28.317 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 㫰г苽蒺汔퀼糥南⾟矜詓ᱹᝡ᩟哯ꐸ白
09:51:28.336 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 曉粭铒╔꼘ꝥ幧勱툼暬猉⨟囵⸌椁腜쥫聳嗠鵶우㹯Ӆ嫩칕∈욡漭勉ꛯベꬿ
09:51:28.353 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 朑稔⪭睂郧㾛譹놨फ躍ඤ甗憈욥⍍ﴧ
09:51:28.364 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 跛٧咣䂅챔㓩㰳ﭶ暠뉄﯃✲㤒蠢져흡ছÌꋪ㘾࿡쏻һ
09:51:28.429 [main] INFO  c.g.d.d.s.BrowseDiaryServiceTest - 謣뒬떡巖䞽ह

 

이런식으로 정말 랜덤이죠.

 

사용 방법은 다음과 같습니다.

 

  1. 원숭이에게 '어떻게' 객체들을 만들어야 하는지 선언 해주기
FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE)
        .build();

 

이 경우 BuilderArbitraryIntrospector를 사용했는데, 이 뜻은 Builder로 객체들을 만들어 달라는 뜻입니다.
이 외의 방법들이 있으니 docs를 참고하시길 바랍니다.

 

  1. 원숭이에게 달라고 요청하기
    .gitMeOne()으로 하나만 달라고 요청할 수도 있고, .giveMe()로 여러 개 요청하거나 .giveMeBuilder()를 사용하여 커스텀된 랜덤 객체를 생성할 수도 있습니다.
// 하나만 달라고 요청하기
Member member = fixtureMonkey.giveMeOne(Member.class);

// 커스텀된 랜덤 객체를 하나 달라고 요청하기
Member member = fixtureMonkey.giveMeBuilder(Member.class)
          .set("currentColorCode", new ColorCode())
          .sample();

// 이 때, sampleList()를 사용해서 만드는 개수도 지정해 줄 수 있다.
List<Diary> diaries = fixtureMonkey.giveMeBuilder(Diary.class)
                  .set("member", member)
                  .set("conditionLevel", fixtureMonkey.giveMeOne(ConditionLevel.class))
                  .sampleList(20);

 

제멋대로인 원숭이와 정말 얘기하는 느낌이 나는 메서드로 이뤄져있어 사용하는 데 재미있었고,

한국에서 만든 오픈 소스이다보니 docs가 한국어로 되어있어 읽기가 매우 편해 더 좋았습니다.