Junit4: BiMatcher ๊ณ„์ธต ๋„์ž…

์— ๋งŒ๋“  2018๋…„ 02์›” 08์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: junit-team/junit4

์ข‹์€ ๊ธฐ๋Šฅ์€ BiMatcher ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( org.hamcrest.Matcher ์˜ ์œ ์‚ฌํ•˜์ง€๋งŒ 2๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ). ๋˜๋Š” ํ‘œ์ค€ Comparator ๋ฅผ ์ด ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ BiPredicate ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(JUnit์„ Java-8์— ์—ฐ๊ฒฐํ•˜์ง€๋งŒ ๊ธฐ๋ณธ AND/OR/NOT ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•จ).
๋ชจ๋“  ์ถ”๊ฐ€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • BiMatcher , BiPredicate ๋ฐ Comparator ์ด๋ฆ„์€ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ตœ์ข…์ ์ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

Assert ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•  ์ฃผ์š” ๋ฉ”์†Œ๋“œ:

  • assertThat(T expected, T actual, Comparator<T> biMatcher);
  • assertThat(String message, T expected, T actual, Comparator<T> biMatcher); (ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ, ์•„๋ž˜ ์ฐธ์กฐ).
  • ์—ฌ๋Ÿฌ assertArray() ๋ฉ”์„œ๋“œ(์•„๋ž˜ ์ฐธ์กฐ).

๋™๊ธฐ: ๋•Œ๋กœ ๊ฐœ์ฒด ๋ฐฐ์น˜์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋งŽ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ธฐ๋Šฅ์€ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋งŽ์€ ์ถ”๊ฐ€ ์ฝ”๋“œ(๋ฃจํ”„ ๋ฐ ์กฐ๊ฑด)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Comparator ํ•˜๋ฉด ๋” ์ ์€ ์ฝ”๋“œ๋กœ ๋” ๋†’์€ ์œ ์—ฐ์„ฑ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์˜ˆ (์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•จ): ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•˜์ง€ ์•Š์€์ง€ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ถ€์šธ ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

ํ˜„์žฌ JUnit ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋” ์งง์€:

for (int i = 0; i < elements.length - 1; i++) {
  if (checkSame) { // Same
    assertSame("elements must be the same.", elements[i], elements[i + 1]);
  } else { // Not same
    assertNotSame("elements must be not the same.", elements[i], elements[i + 1]);
  }
}

๋” ๋‚˜์€ ์„ฑ๋Šฅ(๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ฐ€ ํ…Œ์ŠคํŠธ์—์„œ ์„ฑ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€):

if (checkSame) { // Same
  for (int i = 0; i < elements.length - 1; i++) {
    assertSame("elements must be the same.", elements[i], elements[i + 1]);
  }
else { // Not same
  for (int i = 0; i < elements.length - 1; i++) {
    assertNotSame("elements must be not the same.", elements[i], elements[i + 1]);
  }
}

๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ์ž์‹ ์˜ ๊ตฌํ˜„ํ•  ์ˆ˜ Comparator ์‚ฌ์šฉํ•  assertTrue()/assertFalse() (์šฐ๋ฆฌ๋Š” ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ), ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ ๋น„๊ต๊ธฐ์˜ ์ฝ”๋“œ๋„ ํฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์งง๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Comparator<T> comparator = checkSame ? BiMatchers.same() : BiMatchers.notSame();
String message = checkSame ? "elements must be the same." : "elements must be not the same.";
for (int i = 0; i < elements.length - 1; i++) {
  assertThat(message, elements[i], elements[i + 1], comparator);
}

๋” ์งง๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ ํƒ์  message ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Comparator ๋ฅผ MessagedComparator ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ JUnit์ด ์–ด๋–ป๊ฒŒ๋“  ๊ฑฐ๊ธฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด:

MessagedComparator<T> comparator = checkSame ? BiMatchers.same("elements must be the same.") : BiMatchers.notSame("elements must be not the same.");
for (int i = 0; i < elements.length - 1; i++) {
  assertThat(message, elements[i], elements[i + 1], comparator);
}

๊ฒฐ๊ณผ๋Š” ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•ฉ๋‹ˆ๋‹ค.
1) Assert ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ฝ”๋“œ ์—†์ด ํ‘œ์ค€ ๋˜๋Š” ์ž์ฒด ๋น„๊ต๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
2) ์ด์ „์˜ ๊ฒฐ๊ณผ๋กœ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์กฐ๊ฑด์„ ๋” ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3) ์ถ”๊ฐ€ ๋กœ์ง ์บ์Šค์ผ€์ด๋”ฉ(AND, OR, NOT)์„ ์ฆ‰์‹œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( org.hamcrest.CoreMatchers ์™€ ์œ ์‚ฌ). ํ˜„์žฌ ์ƒˆ๋กœ์šด ๋ฏธ๋‹ˆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: assertNotSame() ์˜†์— assertSame() . ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ assertTrue()/assertFalse() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
4) Assert ํด๋ž˜์Šค ์ „์ฒด๋ฅผ ํ†ต์ผ๋œ ํ˜•ํƒœ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ:

public static void assertSame(String message, Object expected, Object actual) {
  assertThat(message, expected, actual, BiMatchers.same())
}

public static void assertThat(String message, T expected, T actual, Comparator<T> biMatcher) {
...
}

๋˜๋Š” ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด:

public static void assertSame(String message, Object expected, Object actual) {
  assertThat(expected, actual, BiMatchers.same(message))
}

public static void assertThat(T expected, T actual, MessagedComparator<T> biMatcher) {
...
}

5) assertArray() ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ด์ „ ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง๋จ). ์˜ˆ:

public static void assertArrayEquals(boolean[] expecteds, boolean[] actuals) {
  assertArray(expecteds, actuals, BiMatchers.equals());
}

public static void assertArray(boolean[] expecteds, boolean[] actuals, Comparator<Boolean>) {
...
}

๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด 2๊ฐœ์˜ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‰ฌ์šด์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Assert.assertArray(array1, array2, BiMatchers.same());

๋˜ํ•œ ๋ฐฐ์—ด ๊ธธ์ด ๋˜๋Š” ๊ธฐํƒ€ ๊ฒ€์‚ฌ๋ฅผ ๋ณ„๋„๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์‚ฌ ์ฝ”๋“œ:

Assert.assertArray(array1, array2, and(sameLength(), same()));

๋ชจ๋“  9 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

JUnit 4.x๊ฐ€ ๋” ๋งŽ์€ ์–ด์„ค์…˜ DSL์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. DSL์„ ์ •ํ™•ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Truth ๋˜๋Š” Fest์™€ ๊ฐ™์€ ํ›Œ๋ฅญํ•œ ํƒ€์‚ฌ ์ฃผ์žฅ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ JUnit์—์„œ ์ด์— ๋Œ€ํ•ด ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Java 8์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ http://github.com/junit-team/junit5 ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@gitIvanB ๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @kcooney ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ

@kcooney , @marcphilipp , ํžŒํŠธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€ ์งˆ๋ฌธ ํ•˜๋‚˜. ๊ฒฝํ—˜์ƒ Assert ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠนํžˆ JUnit-4์—์„œ JUnit-5๋กœ์˜ ํ–ฅํ›„ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

@gitIvanB ์งˆ๋ฌธ์ด ์•ฝ๊ฐ„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. junit4์— ๋Œ€ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ org.junit.Assert ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  junit5์— ๋Œ€ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ org.junit.jupiter.api.Assertions

๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ชจ๋“  ์ค„์— Assert. ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ๋ฉ”์„œ๋“œ๋ฅผ ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@gitIvanB ํ™•์‹คํžˆ junit.framework.Assert ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ org.junit.Assert ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ IDE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JUnit 4๋ฅผ JUnit Jupiter ์–ด์„ค์…˜์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(IDEA์—์„œ ์ด๋ฏธ ์ง€์›). ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์„ ํƒ์  ๋ฉ”์‹œ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ JUnit 4์—์„œ๋Š” ์ฒ˜์Œ์ด์ง€๋งŒ Jupiter์—์„œ๋Š” ๋งˆ์ง€๋ง‰์— ์˜จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์ง€๊ธˆ ๋‹ค๋ฅธ ์–ด์„ค์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  Vintage์—์„œ Jupiter๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@panchenko , @marcphilipp ๊ทธ๋ž˜์„œ JUnit-4์˜ org.junit.Assert ๊ฐ€ ๋ด‰์ธ๋˜์–ด ์žˆ๊ณ  ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด๊ฐ•๋˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. JUnit-5์—์„œ๋Š” org.junit.jupiter.api.Assertions ( org.junit.Assert ๋Œ€์ฒด) ๋˜๋Š” ์ผ๋ถ€ assertion lib๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
JUnit-5๋ฅผ ๋ฐฐ์šฐ๋ ค๋ฉด ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜์ง€๋งŒ org.junit.jupiter.api.Assertions ์–ธ๋œป ๋ณด๊ธฐ์— ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ org.junit.Assert ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JUnit-5์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•ด์•ผ ํ•  ํฐ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. :) ์ €๋Š” JUnit-5๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ ์ฃผ์žฅ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ฃผ์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์™„์ „ํžˆ ์œ„์ž„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@gitIvanB JUnit์˜ ์ฒ ํ•™์€ Java์—์„œ Java ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ JUnit๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ’๋ถ€ํ•œ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์ข…์ข… ๋ด…๋‹ˆ๋‹ค.

์–ด์„ค์…˜์˜ ๊ฒฝ์šฐ ๋•Œ๋กœ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‹ค ํ’๋ถ€ํ•œ ์–ด์„ค์…˜ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Google Truth(https://github.com/google/truth), FEST(https://github.com/alexruiz/fest-assert-2.x), AssertJ(http://joel- costigliola.github.io/assertj/) ๋ฐ Hamcrest(http://hamcrest.org/JavaHamcrest/).

๋†€๋ผ์šด ์ฃผ์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— org.junit.Assert ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( junit.framework.Assert ๋™๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€๋งŒ). ์‚ฌ์‹ค, 4.13์€ assertThrows ๋„์ž…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋งŒํผ ํ’๋ถ€ํ•œ ์ฃผ์žฅ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•˜๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์˜ ์‚ฌ์šฉ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฑด์ „ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ˜•์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ˆ˜์šฉํ•˜๊ณ  ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JUnit5์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์›๋ž˜ ๊ฐœ๋ฐœ์ž๋Š” ์ฃผ์žฅ ๋ฐฉ๋ฒ•์˜ ์ข‹์€ ๊ธฐ์ดˆ ์—†์ด๋Š” ์ฐจ์„ธ๋Œ€ JUnit์„ ์ถœ์‹œํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋Š๊ผˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋ จ๋œ ๊ฒƒ์€ JUnit5๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JUnit5๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค). ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ๊ธฐ๋ณธ ์–ด์„ค์…˜ API๊ฐ€ Kent, Erich ๋ฐ David๊ฐ€ ํ–ˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฒฐ์ •์„ ๋‚ด๋ ธ์œผ๋ฏ€๋กœ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ JUnit์—์„œ Hamcrest๋‚˜ Truth์™€ ๊ฐ™์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ DSL์ฒ˜๋Ÿผ ํ’๋ถ€ํ•œ ์ฃผ์žฅ ์ง‘ํ•ฉ์„ ๊ฒฐ์ฝ” ๋ณผ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์œ ํ˜•์˜ ๋ณ€๊ฒฝ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ JUnit5 ํŒ€์— ๋งก๊น๋‹ˆ๋‹ค. ๋ผ๋Š” ์ƒ๊ฐ์ด ๊ฐ•ํ•˜๊ฒŒ ๋“ ๋‹ค๋ฉด
๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ข‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ์ดˆ๋กœ ์ค‘์š”ํ•˜๋ฏ€๋กœ ๊ฑฐ๊ธฐ์—์„œ ์ž์œ ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JUnit 5(๋‹น์‹œ ์ฝ”๋“œ๋ช… "JUnit Lambda")์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ Assertion ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” JUnit 5 ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

JUnit Jupiter์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด์„ค์…˜ ๊ธฐ๋Šฅ์€ ๋งŽ์€ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์„ฑ๋Šฅ๊ณผ ๋งค์ฒ˜์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ JUnit ํŒ€์€ AssertJ, Hamcrest, Truth ๋“ฑ๊ณผ ๊ฐ™์€ ํƒ€์‚ฌ ์ฃผ์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ์„ ํƒํ•œ ์ฃผ์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณ ์ •๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋ชฉํ‘œ๋Š” JUnit 4์—์„œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ์–ด์„ค์…˜ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž์ฒด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด AssertJ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰