[Spring] ๐ŸŒฑ Junit5์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ

์ด์ค€์˜ยท2023๋…„ 9์›” 11์ผ
0

๐ŸŒฑ Spring

๋ชฉ๋ก ๋ณด๊ธฐ
15/18
post-thumbnail

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ JUnit5๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์žˆ๋Š”๋ฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค์„ ์ •๋ฆฌํ•ด ๋†“์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒฑ Junit5

์ž๋ฐ” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŒ… ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. JUnit 5๋Š” ์ž๋ฐ” 8 ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. JUnit5์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ค‘ ์ผ๋ถ€๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

@Test

@Test ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์ž„์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


@BeforeAll, @AfterAll

@BeforeAll์„ ํ†ตํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ตœ์ดˆ๋กœ ์ˆ˜ํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , @AfterAll์„ ํ†ตํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@BeforeAll
static void beforeAll() {
	System.out.println("๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ตœ์ดˆ๋กœ ์ˆ˜ํ–‰");
}
    
@AfterAll
static void afterAll() {
	
System.out.println("๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜ํ–‰");
}


@BeforeEach, @AfterEach

@BeforeEach๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ด์ „์— ์ˆ˜ํ–‰์‹œํ‚ฌ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , @AfterEach๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ์ดํ›„ ์ˆ˜ํ–‰์‹œํ‚ฌ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@BeforeEach
void setUp() {
	System.out.println("๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰");
}

@AfterEach
void tearDown() {
	System.out.println("๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„์— ์ˆ˜ํ–‰");
}


@DisplayName

@DisplayName ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์‹คํ–‰์‹œ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ์•„๋‹Œ ์ง€์ •ํ•œ ๊ฐ’์„ ๊ฒฐ๊ณผ๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ํ…Œ์ŠคํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์คŒ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ํฌ๊ฒŒ๊ณ ๋ฏผํ•˜์ง€ ์•Š๊ณ  ์ง€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Test
@DisplayName("์ด ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.")
void test1() {
	System.out.println("ํ…Œ์ŠคํŠธ 1");
}


@Disabled

@Disabled ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ง‰์•„๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Test
@Disabled
void ํ…Œ์ŠคํŠธ_1() {
}

@Test
void ํ…Œ์ŠคํŠธ_2() {
}


@Nested

@Nested ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ๋Š” ์›ํ•˜๋Š” ์ฃผ์ œ๋ณ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌถ์–ด์„œ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Nested
@DisplayName("Test 1 ์ฒซ๋ฒˆ์งธ ์ฃผ์ œ")
class Test1 {
	@Test
    @DisplayName("Test1 - test1()")
	void test1() {
    	System.out.println("Test1.test1");
    }

	@Test
    @DisplayName("Test1 - test2()")
    void test2() {
    	System.out.println("Test1.test2");
    }
}

@Nested
@DisplayName("Test2 ๋‹ค๋ฅธ ์ฃผ์ œ")
class Test2 {

	@Test
    @DisplayName("Test2 - test1()")
    void test1() {
    	System.out.println("Test2.test1");
    }

	@Test
    @DisplayName("Test2 - test2()")
    void test2() {
    	System.out.println("Test2.test2");
    }
}


@TestMethodOrder, @Order

@TestMethodOrder ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ @Order ์–ด๋…ธํ…Œ์ด์…˜์— ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Nested
@DisplayName("ํ…Œ์ŠคํŠธ ์ˆœ์„œ ์ •ํ•ด์„œ ์‹คํ–‰ํ•˜๊ธฐ")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class Test0 {

	@Order(1)
    @Test
    @DisplayName("Test 1 - ์ฒซ๋ฒˆ์งธ")
    void test1() {
    	System.out.println("1");
    }

	@Order(3)
    @Test
    @DisplayName("Test2 - ์„ธ๋ฒˆ์งธ")
    void test2() {
    	System.out.println("3");
    }

	@Order(2)
    @Test
    @DisplayName("Test3 - ๋‘๋ฒˆ์งธ")
    void test3() {
    	System.out.println("2");
    }
}


@RepeatedTest

@RepeatedTest๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

value ๊ฐ’์œผ๋กœ ๋ช‡๋ฒˆ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ธ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , name ๋ถ€๋ถ„์— {currentRepetition} ๋ฅผ ํ†ตํ•ด ๋ช‡๋ฒˆ์งธ ๋ฐ˜๋ณต์ค‘์ธ์ง€, {totalRepetitions} ๋ฅผ ํ†ตํ•ด ์ด ๋ช‡๋ฒˆ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€ ํ…Œ์ŠคํŠธ ๋งˆ๋‹ค ์ด๋ฆ„์„ ์ •์˜ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ RepetitionInfo ๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ํ˜„์žฌ ๋ช‡๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰์ค‘์ธ์ง€, ์ด ๋ช‡๋ฒˆ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


@RepeatedTest(value = 5, name = "๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ {currentRepetition} / {totalRepetitions}")
void repeatTest(RepetitionInfo info) {
	System.out.println("ํ…Œ์ŠคํŠธ ๋ฐ˜๋ณต : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
}


@ParameterizedTest

@ParameterizedTest๋ฅผ ํ†ตํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @ValueSource๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•˜๊ณ , ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
(์•„๋ž˜์˜ ๊ฒฝ์šฐ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ„๋กœ ํ•œ๋ฒˆ์”ฉ ์ด 9 ๋ฒˆ ํ…Œ์ŠคํŠธ ๋ฐ˜๋ณต ์‹คํ–‰)

@DisplayName("ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9}) // ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
void parameterTest(int num) {
	System.out.println("5 * num = " + 5 * num);
}


๐ŸŒฑ Assertions

์ด์ „์—๋Š” ์ฃผ๋กœ assertj ์˜ Assertions ์—์„œ assertThat() ๋ฉ”์†Œ๋“œ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์—ˆ์ง€๋งŒ, ์˜ค๋Š˜์€ jupiter์˜ Assertions ๋ฉ”์†Œ๋“œ๋ฅผ ์ •๋ฆฌ ํ•ด ๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

assert(Not)Equals(expected, actual)

๋ฉ”์†Œ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‹ค์ œ๋กœ ๋‚˜์˜จ ๊ฐ’์„ ๋„ฃ์–ด ์˜ˆ์ƒ๊ณผ ์‹ค์ œ๊ฐ€ ๋งž๋Š”์ง€ ํŒ๋‹จํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ธก๊ณผ ์‹ค์ œ ๊ฐ’์ด ๋‹ค๋ฅผ๊ฒฝ์šฐ ์‹ค์ œ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

@Test
@DisplayName("assertEquals")
void test1() {
	Double result = 4.0/2;
	assertEquals(2.5, result);
}

์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ์›ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ถœ๋ ฅํ•ด ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@Test
@DisplayName("assertEquals - Supplier")
void test1_1() {
	Double result = calculator.operate(5, "/", 0);
	// ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ (new Supplier<String>())
	assertEquals(2.5, result, () -> "์—ฐ์‚ฐ์ž ํ˜น์€ ๋ถ„๋ชจ๊ฐ€ 0์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”!");
}


assertTrue(true), assertFalse(false)

assertTrue, assertFalse๋ฅผ ํ†ตํ•ด ์ฐธ ๊ฑฐ์ง“์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@Test
@DisplayName("assertTrue ์™€ assertFalse")
void test2() {
	assertTrue(true);   // ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๊ฐ’์ด true์ผ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
	assertFalse(false); //  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๊ฐ’์ด false์ผ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
}

assert(Not)Null(Object)

assertNull์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Null์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋„ ํŒ๋‹จ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Test
@DisplayName("assertNotNull ๊ณผ assertNull")
void test3() {
	Double result1 = calculator.operate(5, "/", 2);
	assertNotNull(result1);
	Double result2 = calculator.operate(5, "/", 0);
	assertNull(result2);
}

assertThrows

assertThrows๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ๋ฐœ์ƒํ• ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” Exception์˜ ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ๊ณ , ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ƒํ™ฉ์„ ๋„ฃ์–ด์„œ ํ…Œ์ŠคํŠธ ํ•ฉ๋‹ˆ๋‹ค.

@Test
@DisplayName("assertThrows")
void test4() {
	IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
		throw new IllegalArgumentException("IllegalArgumentException ๋ฐœ์ƒ");
	});
	assertEquals("IllegalArgumentException ๋ฐœ์ƒ", exception.getMessage());
}

์ด ์™ธ์—๋„ ๋” ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”๋ฐ์š”, ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ์•„๋ณด๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์•„๋ž˜ ์ฐธ๊ณ  ๋งํฌ๋ฅผ ํ†ตํ•ด ๋” ๋‹ค์–‘ํ•œ JUnit5 ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



์ฐธ๊ณ 
profile
์ž‘์€ ๊ฑธ์Œ์ด๋ผ๋„ ๊พธ์ค€ํžˆ

0๊ฐœ์˜ ๋Œ“๊ธ€