[Fixture Monkey] ํฝ์ค์ณ ๋ชฝํค๋ก ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ (Java Spring)
๐น 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์ ์ฌ์ฉํ์ต๋๋ค.
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๋ ๊ฒฐ๊ณผ๋ฌผ๋ ๋ค์ํ๊ฒ ์ด์ํ ์ ๋ค์ด ๋ค์ด์์ต๋๋ค.
๐น ๊ฒฐ๋ก
๊ฐ์ฒด์ ํน์ฑ์ ๋ง๊ฒ ๋ค์ํ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ํ ์คํธ ๊ฐ์ฒด ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ต๋๋ค.
๋ฌธ์๋ฅผ ์ฝ์ด๋ณด๋ ๋ค์ํ ํ์ ์ ๊ฐ์ฒด ์์ฑ ๊ฐ์ด๋๋ ์๊ณ , ์ํ๋ ์กฐ๊ฑด์ ๋ฃ๋ ๋ฐฉ๋ฒ์ด ์ค๋ช ๋์ด์์ต๋๋ค.
`๊ฐ์ฒด๋ฅผ ๋๋คํ๊ฒ ๋ง๋๋๋ฐ, ํน์ ์์ฑ์ ์ด๋ค ๊ฐ ์ค์์ ํ๋๋ฅผ ๋ฃ์ด์ค.` ๋ฑ๋ฑ ๋ค์ํ ์ปค์คํ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด์ธ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๊ณผ ์ต์ ์ด ์๊ณ , ํ๋ฌ๊ทธ์ธ์ ๋ํ ์ค๋ช ๋ ์์ธํ ์์ต๋๋ค.
๋ฌธ์๊ฐ ๊ธธ์ง ์์ผ๋ ์ฌ์ฉํ๊ธฐ์ ์ ์ถฉ๋ถํ ์ฝ์ด๋ณด๊ณ ์ฐ๊ธธ ๋ฐ๋๋๋ค.
์ฌ์ด๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ค๊ฐ ๊ด์ฐฎ๋ค ์ถ์ผ๋ฉด ํ์ฌ์ ๋ค๊ณ ๊ฐ์ ์จ๋ด์ผ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Fixture Monkey 2ํ] validation ํ ์คํธ ํ๊ธฐ (w/ JPA Repository) (2) | 2023.12.03 |
---|---|
[WebClient] Spring์์ API ํธ์ถํ๊ธฐ (0) | 2022.04.07 |