JUnit

TDD๋ฅผ ๊ณต๋ถ€ํ•˜๋˜ ์ค‘์— Java์˜ ๋Œ€ํ‘œ์ ์ธ Testing Framework์ธ JUnit์— ๋Œ€ํ•ด ์˜ˆ์ „์— ๊ณต๋ถ€๋ฅผ ํ–ˆ์—ˆ์ง€๋งŒ ์ž˜ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค. JUnit์˜ ์–ด๋– ํ•œ Method๊ฐ€ ์žˆ๋Š”์ง€ ๊ทธ ์—ญํ• ์€ ๋ญ”์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

xUnit์ด๋ž€?

  • ์ž๋ฐ”๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„ ์›Œํฌ์ธ JUnit๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋ณดํ†ต ์ด๋ฆ„์„ xUnit์ด๋ผ ์นญํ•œ๋‹ค.

xUnit์ด๋ฆ„ | ํ•ด๋‹น ์–ธ์–ด | ๊ด€๋ จ ์‚ฌ์ดํŠธ --------------- | ---------------- CUnit | C | http://cunit.sourceforge.net/ CppUnit | C++ | https://sourceforge.net/projects/cppunit/ PHPUnit | PHp | https://phpunit.de/ PyUnit | Python | http://pyunit.sourceforge.net/ JUnit | Java | http://junit.org/

1. JUnit ํ™˜๊ฒฝ๊ตฌ์ถ•ํ•˜๊ธฐ

  • Maven์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • pom.xml์— dependency๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • JUnit Source : https://mvnrepository.com/artifact/junit/junit
  • Compile Dependencies๊ฐ€ ์žˆ๋Š” JUnit์€ hamcrest๋ฅผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • pom.xml์˜ ๋ชจ์Šต
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2. JUnit Assert๊ด€๋ จ Method

Method๋‚ด์šฉ
assertArrayEquals(a,b)๋ฐฐ์—ด a์™€b๊ฐ€ ์ผ์น˜ํ•จ์„ ํ™•์ธํ•œ๋‹ค.
assertEquals(a,b)๊ฐ์ฒด a์™€b์˜ ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
assertSame(a,b)๊ฐ์ฒด a์™€b๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ž„์„ ํ™•์ธํ•œ๋‹ค.
assertTrue(a)a๊ฐ€ ์ฐธ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
assertFalse(a)a๊ฐ€ ๊ฑฐ์ง“์ธ๊ธฐ ํ™•์ธํ•œ๋‹ค.
assertNotNull(a)a๊ฐ์ฒด๊ฐ€ Null์ด ์•„๋‹˜์„ ํ™•์ธํ•œ๋‹ค.

3. JUnit Function Flow

  • setUp() : ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ํด๋ž˜์Šค์˜ ์‹คํ–‰์ „์— ๊ฐ€์žฅ ๋จผ์ € setUP()์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ex) ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ, DB ์—ฐ๊ฒฐ์— ํ™œ์šฉํ•œ๋‹ค.
  • tearDown() : ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ˆ˜ํ–‰๋˜๋ฉฐ setUp()์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    • ex) ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ข…๋ฃŒ, DB ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š”๋ฐ ํ™œ์šฉํ•œ๋‹ค.
  • setUp()๊ณผ tearDown()์€ Test Case๋ฅผ ์ง„ํ–‰ํ• ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
    • ex) setUp() โ†’ TestA() โ†’ tearDown() โ†’ setUp() โ†’ TestB() โ†’ tearDown()

4. JUnit Annotation

  • @Test : ํ•ด๋‹น Method๋Š” Test๋Œ€์ƒ ๋ฉ”์†Œ๋“œ์ž„์„ ์˜๋ฏธํ•œ๋‹ค.
public class Example {
    @Test
    public void method() {
       org.junit.Assert.assertTrue( new ArrayList().isEmpty() );
    }
 }
  • @BeforeClass : ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘ ์ „์— ๋”ฑ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ์ง€์ •ํ•œ๋‹ค.
public class Example {
   @BeforeClass public static void onlyOnce() {
      ...
   }
   @Test public void one() {
      ...
   }
   @Test public void two() {
      ...
   }
}
  • @AfterClass : ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๊ณ  ๋”ฑ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ์ง€์ •ํ•œ๋‹ค.
public class Example {
   DatabaseConnection database;
   @BeforeClass public static void login() {
         database= ...;
   }
   @Test public void something() {
         ...
   }
   @Test public void somethingElse() {
         ...
   }
   @AfterClass public static void logout() {
         database.logout();
   }
}
  • @Before : ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ž‘์—…ํ•  ๋‚ด์šฉ์„ ํ˜ธ์ถœํ•œ๋‹ค.
public class Example {
   List empty;
   @Before public void initialize() {
      empty= new ArrayList();
   }
   @Test public void size() {
      ...
   }
   @Test public void remove() {
      ...
   }
}
  • @After : ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰์ด ๋๋‚œ ํ›„์— ์ž‘์—…ํ•  ๋‚ด์šฉ์„ ํ˜ธ์ถœํ•œ๋‹ค.
public class Example {
    File output;
    @Before public void createOutputFile() {
          output= new File(...);
    }
    @Test public void something() {
          ...
    }
    @After public void deleteOutputFile() {
          output.delete();
    }
 }
  • @Ignore : TestCase๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
@Ignore
public class IgnoreMe {
  @Test public void test1() { ... }
  @Test public void test2() { ... }
}
  • Flow

Reference