Skip to content

Latest commit

ย 

History

History
102 lines (90 loc) ยท 4.67 KB

JUnit-@ParameterizedTest.md

File metadata and controls

102 lines (90 loc) ยท 4.67 KB

@ParameterizedTest

๊ฐœ์š”

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด, ํ•œ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ทœ์น™์ด ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ๋‚˜ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์ด ๋งŽ์€ ๊ฒฝ์šฐ ์ผ์ผ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • JUnit์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ @ParameterizedTest ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.
    • @Test ๋Œ€์‹  @ParameterizedTest ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ ์–ธํ•ด์ฃผ๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ๊ฐ’๋“ค์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

@ValueSource

  • ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์— ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ๋ฒ•
  • ํ…Œ์ŠคํŠธ์— ์ฃผ์ž…ํ•  ๊ฐ’์„ ์–ด๋…ธํ…Œ์ด์…˜์— ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์— ์ธ์ˆ˜๋กœ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ์ฃผ์ž…ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  • @ValueSource์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•
    • byte, short, int, long, float, double, char, boolean
    • String, Class
@ParameterizedTest
@ValueSource(strings = {"", " "})
void ์œ ์ €๋„ค์ž„์œผ๋กœ_User_์ƒ์„ฑํ•˜๊ธฐ(String userName) {
    assertThatThrownBy(() -> new User(userName))
        .isInstanceOf(IllegalArgumentException.class);
}

@CsvSource

  • input ๊ฐ’๊ณผ expect (๊ธฐ๋Œ€๊ฐ’) ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • value ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๋Š”๋ฐ, ์ด ๋•Œ "{input},{expect}"์˜ ํ˜•ํƒœ๋กœ ๊ตฌ๋ถ„์ž๊ฐ€ ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ์„ ๋„ฃ์–ด์ค€๋‹ค.
    • ๊ธฐ๋ณธ ๊ตฌ๋ถ„์ž๋Š” ์ฝค๋งˆ(',')์ด์ง€๋งŒ, delimiter ๊ฐ’์„ ์ง์ ‘ ์ •์˜ํ•ด์„œ ์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • delimiter ๊ตฌ๋ถ„์ž๋Š” String์ด ์•„๋‹Œ char ๊ฐ’
    •  @CsvSource(value = {"1:2", "3:4"}, delimiter = ':')
    • String์„ ๊ตฌ๋ถ„์ž๋กœ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด delimiterString ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.
    •  @CsvSource(value = {"1//2", "3//4"}, delimiterString = "//")
@ParameterizedTest
@CsvSource(value = {"1,2", "2,4", "3,6"})
void 2_๊ณฑํ•˜๊ธฐ_ํ…Œ์ŠคํŠธ(int input, int expected) {
    assertThat(multiplyBy2(input)).isEqualTo(expected);
}

@NullSource, @EmptySource, @NullAndEmptySource

  • @NullSource๋Š” ํ…Œ์ŠคํŠธ ์ธ์ž๋กœ null์„, @EmptySource๋Š” ๋นˆ ๊ฐ’์„, @NullAndEmptySource๋Š” null๊ณผ ๋นˆ ๊ฐ’์„ ๋ชจ๋‘ ์ฃผ์ž…ํ•œ๋‹ค.
  • ์ด ๋•Œ ์›์‹œ ๊ฐ’ (byte, short, int, long, float, double, char, boolean) ์€ null์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๊ฐ€ ์›์‹œ ๊ฐ’์ด๋ผ๋ฉด @NullSource, @NullAndEmptySource๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • @NullSource์™€ @EmptySource๋ฅผ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•œ ๊ฒƒ์€ @NullAndEmptySource์™€ ๊ฐ™๋‹ค.
  • @ValueSource์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
@ParameterizedTest
@NullAndEmptySource
@ValueSource(strings = {"", " "})
void ์œ ์ €๋„ค์ž„์œผ๋กœ_User_์ƒ์„ฑํ•˜๊ธฐ(String name) {
    assertThatThrownBy(() -> new User(name))
        .isInstanceOf(IllegalArgumentException.class)
}

@EnumSource

  • Enum ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @EnumSource ์•ˆ์— Enum ํด๋ž˜์Šค๋งŒ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋˜๊ณ , ํŠน์ • ๊ฐ’๋งŒ ํ•„์š”ํ•  ๊ฒฝ์šฐ value์— Enum ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , names์— ์„ ํƒํ•  ๊ฐ’์˜ ์ด๋ฆ„์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์ด ๋•Œ names๊นŒ์ง€ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์ถ”๊ฐ€๋กœ mode ๊ฐ’์„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ง€์›ํ•˜๋Š” mode๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • INCLUDE
    • EXCLUDE
    • MATCH_ALL
    • MATCH_ANY
@ParameterizedTest
@EnumSource(value = Color.class, names = {"PINK", "CORAL"})
void ์ƒ‰์ƒ์˜_๋ฒ ์ด์Šค_์ƒ‰์ƒ_ํ…Œ์ŠคํŠธ(Color color) {
    assertThat(color.getBaseColor()).isEqualTo(Color.RED);
}

@MethodSource

  • ์œ„ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ ๋ณต์žกํ•œ Object๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • @MethodSource๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋ณต์žกํ•œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
@ParameterizedTest
@MethodSource("provideBlankStrings")
void ๋ฌธ์ž์—ด_isBlank_ํ…Œ์ŠคํŠธ(String input, boolean expected) {
    assertThat(input.isBlank()).isEqualTo(expected);
}

private static Stream<Arguments> provideBlankStrings() {
    return Stream.of(
        Arguments.of("", true),
        Arguments.of(" ", true),
        Arguments.of("not blank", false)
    );
}
  • provideBlankStrings()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ๋’ค, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ @MethodSource๋กœ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์— ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹
  • @MethodSource์— ์ž‘์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•˜๋ ค๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ ค๋Š” ๋ฉ”์„œ๋“œ๋Š” static ๋ฉ”์„œ๋“œ์—ฌ์•ผ ํ•œ๋‹ค.
  • @MethodSource์— ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด JUnit์ด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ๋„ค์ž„๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•œ๋‹ค.