์ƒˆ์†Œ์‹

Back-End/Java

[JUnit] JUnit์„ ์ด์šฉํ•œ TDD(Test-Driven Development)

  • -

 

 

 

 

 

์˜ค๋Š˜์€ JUnit์„ ์ด์šฉํ•œ TDD(Test-Driven Development) ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ํ™œ์šฉ ์˜ˆ์ œ์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ ์€ ๊ฐ€๊ฐ ์—†์ด ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ํฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋„ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜

 

 


Junit ?!

JUnit์€ ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. TDD๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. JUnit์„ ์ด์šฉํ•œ TDD๋ฅผ ์ ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ ์•ˆ์ •์ ์ด๊ณ  ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ƒ์„ฑ

JUnit์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Test ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

import org.junit.Test;

public class MyTestClass {

    @Test
    public void myTestMethod() {
        // ํ…Œ์ŠคํŠธํ•  ์ฝ”๋“œ ์ž‘์„ฑ
    }
}

 

 

Assert ์‚ฌ์šฉ

JUnit์—์„œ๋Š” ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด Assert ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. Assert ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTestClass {

    @Test
    public void myTestMethod() {
        int a = 5;
        int b = 10;

        int result = a + b;

        assertEquals(15, result);
    }
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” assertEquals ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ result ๋ณ€์ˆ˜์˜ ๊ฐ’์ด 15์ธ์ง€ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Assert ํด๋ž˜์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ ์ ˆํžˆ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์˜ˆ์™ธ ์ฒ˜๋ฆฌ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์˜ˆ์™ธ ์ƒํ™ฉ๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JUnit์—์„œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ธ @Test(expected=Exception.class)์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import org.junit.Test;

public class MyTestClass {

    @Test(expected=NullPointerException.class)
    public void myTestMethod() {
        String str = null;

        str.length();
    }
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” str ๋ณ€์ˆ˜๊ฐ€ null์ธ ์ƒํ™ฉ์—์„œ length() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ, NullPointerException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. @Test(expected=NullPointerException.class)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ˆœ์„œ

JUnit์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ

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

import static org.junit.Assert.*;
import org.junit.*;

public class CalculatorTest {

    @Test
    public void testAddition() {
        Calculator calculator = new Calculator();

        int result = calculator.add(5, 10);

        assertEquals(15, result);
    }
}
300x250

์œ„ ์˜ˆ์ œ์—์„œ๋Š” Calculator ํด๋ž˜์Šค์˜ add ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Calculator ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ add ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๊ฐ’์ด ์˜ˆ์ƒํ•œ ๊ฐ’๊ณผ ๋™์ผํ•œ์ง€ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด์ œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TDD์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ ํ›„ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” add ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›์€ ๋‘ ์ •์ˆ˜๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ฒ€์ฆ

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

JUnit์€ ์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, @Before, @After ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ „๊ณผ ํ›„์— ์‹คํ–‰ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, @RunWith ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ JUnit ์‹คํ–‰ ์‹œ ์ปค์Šคํ…€ ์‹คํ–‰์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JUnit์€ Java ์–ธ์–ด๋ฅผ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ํšจ์œจ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์–ด๋…ธํ…Œ์ด์…˜

JUnit์—์„œ๋Š” ์–ด๋…ธํ…Œ์ด์…˜(annotation)์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @Test: ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • @Before: ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • @After: ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • @BeforeClass: ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ „์— ํ•œ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • @AfterClass: ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ํ›„์— ํ•œ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • @Ignore: ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

์–ด์„œ์…˜

JUnit์—์„œ๋Š” ์–ด์„œ์…˜(assertion)์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์–ด์„œ์…˜์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ AssertionError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์–ด์„œ์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์˜ ์ข…๋ฅ˜๊ฐ€ ๋งค์šฐ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.

  • assertEquals(expected, actual): ๋‘ ๊ฐ’์ด ๋™์ผํ•œ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertArrayEquals(expected, actual): ๋‘ ๋ฐฐ์—ด์ด ๋™์ผํ•œ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertTrue(condition): ์กฐ๊ฑด์ด true์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertFalse(condition): ์กฐ๊ฑด์ด false์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertNull(object): ๊ฐ์ฒด๊ฐ€ null์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertNotNull(object): ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹Œ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertSame(expected, actual): ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • assertNotSame(expected, actual): ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ

JUnit์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ(test runner)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํŠน์ •ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @RunWith: JUnit์˜ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @SuiteClasses: ํŠน์ • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค

 

 

Parameterized Tests

JUnit์—์„œ๋Š” Parameterized Tests๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๋กœ์ง์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ์˜ ํšจ์œจ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @RunWith(Parameterized.class): Parameterized runner๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @Parameters: ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” static ๋ฉ”์„œ๋“œ์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

Exception Tests

JUnit์—์„œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, Exception Tests๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @Test(expected=Exception.class): ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @Rule: ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Rule์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

Timeout Tests

JUnit์—์„œ๋Š” Timeout Tests๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @Test(timeout=millis): ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

Test Suites

JUnit์—์„œ๋Š” Test Suites๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @RunWith(Suite.class): Suite runner๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @SuiteClasses: ์‹คํ–‰ํ•  ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ

Spring Framework์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, JUnit์€ ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์Šคํ”„๋ง ๋นˆ๊ณผ ๊ฐ™์€ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @RunWith(SpringJUnit4ClassRunner.class): Spring๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • @ContextConfiguration: ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋กœ๋“œ๋  XML ํŒŒ์ผ์ด๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

 


๋งˆ์น˜๋ฉฐ..

์œ„์™€ ๊ฐ™์€ JUnit์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ํšจ์œจ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๋™์ž‘์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธฐํšŒ์— ์ €์™€ ๊ฐ™์ด ๋”์šฑ๋” ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์„ JUnit์„ ์ด์šฉํ•ด์„œ ์‹ค์ฒœํ•ด ๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

 

ps) Hoxy.. ์ €๋งŒ ์•ˆ ํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฑฐ๋ผ๋ฉด.. ์ง„์งœ ๋ฐ˜์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข

 

 

 

 

 

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ‘