ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JUnit5μ΄λž€? JUnit ν…ŒμŠ€νŠΈ 방법
    Android/Java 2021. 1. 13. 20:11
    λ°˜μ‘ν˜•
    • 이 글은 "온라인 μžλ°” μŠ€ν„°λ”” λ‚΄μš©"을 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

    JUnit5λž€?

    • JUnit은 μžλ°” ν”„λ‘œκ·Έλž˜λ°μš© λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό ν•  수 μžˆλŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.
    • μš”μ¦˜ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” ν…ŒμŠ€νŠΈ 주도 개발 λ©΄μ—μ„œ μ€‘μš”μ μ΄ λΆ€κ°λœ 만큼 ν•™μŠ΅ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
    • JUnit5은 이전 λ²„μ „κ³ΌλŠ” 달리, JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage μ—¬λŸ¬ 개의 λͺ¨λ“ˆλ‘œ κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    JUnit Platform

    • JUnit Platform 은 JVMμ—μ„œ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‹œμž‘ν•˜κΈ° μœ„ν•œ κΈ°λ°˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
    • λ˜ν•œ, ν”Œλž«νΌμ—μ„œ μ‹€ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈ ν”„λ ˆμž„ μ›Œν¬ κ°œλ°œμ„ μœ„ν•œ TestEngine APIλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
    • λͺ¨λ‘κ°€ 잘 μ•„λŠ” IDEs(Intellj, Eclipse, VS Code), λΉŒλ“œ 도ꡬ(Gradle, Maven, Ant) μ—μ„œλ„ JUnit Platform을 μ§€μ›ν•©λ‹ˆλ‹€.

    JUnit Jupiter

    • JUnit JupiterλŠ” JUnit5μ—μ„œ ν…ŒμŠ€νŠΈ μž‘μ„±μ„ μœ„ν•œ μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈκ³Ό ν™•μž₯ λͺ¨λΈ μ‘°ν•©μž…λ‹ˆλ‹€.
    • 즉, ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μœ„ν•œ 것듀이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

    JUnit Vintage

    • ν”Œλž«νΌμ—μ„œ JUnit3, JUnit4κΈ°λ°˜ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ 싀행될 수 μžˆλŠ” TeseEngine을 μ œκ³΅ν•©λ‹ˆλ‹€.

    JUnit5 Dependecny

    μ €λŠ” Intelljλ₯Ό 주둜 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— Intellj에 JUnit5λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

    test {
        useJUnitPlatform()
    }
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
    
    }
    • Gradle에 JUnit Jupiterλ₯Ό ν• μˆ˜ μžˆλ„λ‘ λ‹€μŒκ³Ό 같은 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
        testCompileOnly 'junit:junit:4.13'
        testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
    }

    Annotations

    JUnit JupiterλŠ” ν…ŒμŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ λ‹€μŒμ˜ annotation을 μ§€μ›ν•©λ‹ˆλ‹€.

    • @Test : λ©”μ„œλ“œκ°€ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @ParameterizedTest : λ©”μ„œλ“œκ°€ 맀개 λ³€μˆ˜κ°€ μžˆλŠ” ν…ŒμŠ€νŠΈμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @RepeatedTest : 반볡 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λ©”μ†Œλ“œμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @TestFactory : 동적 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ ν…ŒμŠ€νŠΈ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @TestTemplate : μ—¬λŸ¬λ²ˆ ν˜ΈμΆœλ˜λ„λ‘ μ„€κ³„λœ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ ν…œν”Œλ¦Ώμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @TestMethodOrder : ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œ 싀생 μˆœμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.
    • @TestInstance : ν…ŒμŠ€νŠΈ 라이프 μ‚¬μ΄ν”Œμ„ κ΅¬μ„±ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.
    • @DisplayName : ν…ŒμŠ€νŠΈ 클래슀 λ˜λŠ” ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμ— λŒ€ν•œ μ‚¬μš©μž 지정 ν‘œμ‹œ 이름을 μ„€μ •ν•©λ‹ˆλ‹€.
    • @DisplayNameGeneration : ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ— λŒ€ν•œ μ»€μŠ€ν…€ 이름 생성기λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • @BeforeEach : λͺ¨λ“  ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œ μ‹€ν–‰ 전에 μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
    • @AfterEach : λͺ¨λ“  ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œ 싀행이 λλ‚˜λ©΄ μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
    • @BeforeAll : ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ μ‹€ν–‰ 전에 μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
    • @AfterAll : ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ 싀행이 λλ‚˜λ©΄ μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
    • @Nested : non-static 쀑첩 ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • @Tag : μƒˆλ‘œμš΄ νƒœκ·Έλ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • @Disable : ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€λ‚˜ ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • @Timeout : 주어진 μ‹œκ°„μ•ˆμ— 싀행을 λͺ»ν•  경우 μ‹€νŒ¨ν•˜λ„λ‘ ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

    Meta Annotation

    JUnit Jupiter annotation은 meta-annotation을 μ‚¬μš©ν•©λ‹ˆλ‹€. meta-annotation은 μžμ‹ μ΄ 직접 annotation을 μ •μ˜ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Test()
    @Tag("fast")
    @interface Fast{
    }
    
    class CalculatorTest {
    
        Calculator c = new Calculator();
        int a = 20;
        int b = 10;
    
        @Test()
        void sum(){
            assertEquals(30,c.sum(a,b));
        }
    
        @Fast()
        void sum2(){
            assertEquals(30,c.sum(a,b));
        }
    }
    • @Tag("fast") λ₯Ό 톡해 FastλΌλŠ” annotation을 μ •μ˜ν•˜μ˜€κ³  Test ν΄λž˜μŠ€μ—μ„œ μ“°λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.
    • @Fast annotationμ•ˆμ—λŠ” @Test도 있기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 ν™•μΈν•˜μ˜€μŠ΅λ‹ˆλ‹€.


    ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ™€ ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œ

    • Test Class : μ΅œμ†Œν•œ ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ 정적 λ©”μ†Œλ“œ 클래슀 λ˜λŠ” 쀑첩 ν΄λž˜μŠ€μž…λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€λŠ” 좔상 ν΄λž˜μŠ€κ°€ 되면 μ•ˆλ˜κ³  ν•˜λ‚˜μ˜ μƒμ„±μžλŠ” κΌ­ κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.

    • Test Method : @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplateκ°€ μ–΄λ…Έν…Œμ΄μ…˜λœ λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

    • Lifecycle Method : @BeforeAll, @AfterAll, @BeforeEach, or @AfterEachκ°€ μ–΄λ…Έν…Œμ΄μ…˜λœ λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

    • Test Method와 Lifecycle MethodλŠ” ν˜„μž¬ 클래슀 λ‚΄μ—μ„œ μ„ μ–Έλ˜κ±°λ‚˜, μŠˆνΌν΄λž˜μŠ€μ— μƒμ†λ˜κ±°λ‚˜, μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 상속 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    class CalculatorTest {
    
        Calculator c = new Calculator();
        int a = 20;
        int b = 10;
    
        @BeforeAll
        static void start(){
            System.out.println("start!");
        }
    
        @BeforeEach
        void methodStart(){
            System.out.println("method start");
        }
    
        @Test
        @DisplayName("SUM")
        void sum() {
            assertEquals(30,c.sum(a,b));
        }
    
        @Test
        @Disabled()
        void sub() {
            assertEquals(10,c.sub(a,b));
        }
    
        @Test
        void mul() {
            assertEquals(200,c.mul(a,b));
        }
    
        @Test
        void div() {
            assertEquals(2,c.div(a,b));
        }
    
        @ParameterizedTest
        @ValueSource(ints = {2,4,6,8})
        void paramTest(int num){
            assertEquals(0,num%2);
        }
    
        @AfterEach()
        void methodFinish(){
            System.out.println("method finish");
        }
    
        @AfterAll()
        static void finish(){
            System.out.println("finish");
        }
    }

    Assert Method

    • assertEquals(x,y) : 객체 x,yκ°€ μΌμΉ˜ν•¨μ„ ν™•μΈν•©λ‹ˆλ‹€.
    • assertArayEquals(a,b) : λ°°μ—΄ A와 Bκ°€ μΌμΉ˜ν•¨μ„ ν™•μΈν•©λ‹ˆλ‹€.
    • assertFalse(x) : xκ°€ false인지 ν™•μΈν•©λ‹ˆλ‹€.
    • assertTrue(x) : xκ°€ True인지 ν™•μΈν•©λ‹ˆλ‹€.
    • assertNull(x) : 객체 xκ°€ null인지 ν™•μΈν•©λ‹ˆλ‹€.
    • seertNotNull(x) : 객체 xκ°€ null이 μ•„λ‹Œμ§€ ν™•μΈν•©λ‹ˆλ‹€.
    • assertSame(x,y) : 객체 x와 yκ°€ 같은 객체의 λ ˆνΌλŸ°μŠ€μž„μ„ ν™•μΈν•©λ‹ˆλ‹€. (30 != 30.0)
    • asswertNotSame(x,y) : 객체 x와 yκ°€ 같은 객체의 λ ˆνΌλŸ°μŠ€κ°€ μ•„λ‹Œμ§€ ν™•μΈν•©λ‹ˆλ‹€.
    • asserfail() : ν…ŒμŠ€νŠΈλ₯Ό μ‹€νŒ¨ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    λ°˜μ‘ν˜•
Designed by Tistory.