ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Unit Test, JUnit4
    Android 2021. 2. 16. 23:52
    ๋ฐ˜์‘ํ˜•

    Unit Test

    • Unit Test๋Š” ๋ง ๊ทธ๋ž˜๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ, Test Driven Development๋กœ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ๋Šฅ ๋‹จ์œ„๋ณ„๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋Œ€ํ‘œ์ ์ธ Unit Test Tool๋กœ JUnit์ด ์žˆ์œผ๋ฉฐ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์šฉ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

    • ์ฃผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ dependency๊ฐ€ ์—†๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋กœ์ปฌ JVM์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    • ๋งŒ์•ฝ, ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” dependecny๊ฐ€ ์žˆ๋‹ค๋ฉฐ Robolectric ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ณ , ํ…Œ์ŠคํŠธ์— ์ตœ์†Œํ•œ์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์™€ dependency๋ผ๋ฉด Mockito์™€ ๊ฐ™์€ ๋ชจ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


    Gradle ์„ค์ •

    Unit Test์˜ ์†Œ์Šค ํŒŒ์ผ์€ module-name/src/test/java ์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.

    JUnit์€ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜์ง€๋งŒ ์—†์„ ๊ฒฝ์šฐ์— defaultConfig์˜ testInstrumentationRunner์™€ dependencies๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

        dependencies {
            // Required -- JUnit 4 framework
            testImplementation 'junit:junit:4.12'
            // Optional -- Robolectric environment
            testImplementation 'androidx.test:core:1.0.0'
            // Optional -- Mockito framework
            testImplementation 'org.mockito:mockito-core:1.10.19'
        }

    ํ…Œ์ŠคํŠธ๊ฐ€ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Robolectric ๋˜๋Š” Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Gradle์— ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


    Test ์ƒ์„ฑ

    Testํ•  ํด๋ž˜์Šค์—์„œ Cmd + Shift + T ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์™ผ์ชฝ Project์ฐฝ์„ Project๋กœ ๋ณ€๊ฒฝ ํ›„ module-name/src/test/java ํด๋”์˜ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•˜์—ฌ New - java class ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํด๋ž˜์Šค์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผํ•  ๋ฉ”์†Œ๋“œ๋“ค์„ ์ฒดํฌํ•˜์—ฌ OK ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


    ์‹ค์Šต

    public class Calculator {
        public int sum(int a, int b){
            return a+b;
        }
        public int sub(int a,int b){
            return a-b;
        }
        public int mul(int a,int b){
            return a*b;
        }
        public int div(int a,int b){
            return a/b;
        }
    }

    Calculator ํด๋ž˜์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Ignore;
    import org.junit.Test;
    public class CalculatorTest {
    
        Calculator c = new Calculator();
        int a = 20;
        int b = 10;
    
        @BeforeClass
        public static void start(){
            System.out.println("start!");
        }
    
        @Before
        public void methodStart(){
            System.out.println("method start");
        }
    
        @Test
        public void sum() {
            Assert.assertEquals(30,c.sum(a,b));
        }
    
        @Test
        @Ignore
        public void sub() {
            Assert.assertEquals(10,c.sub(a,b));
        }
    
        @Test
        public void mul() {
            Assert.assertEquals(200,c.mul(a,b));
        }
    
        @Test
        public void div() {
            Assert.assertEquals(2,c.div(a,b));
        }
    
        @After
        public void methodFinish(){
            System.out.println("method finish");
        }
    
        @AfterClass
        public static void finish(){
            System.out.println("finish");
        }
    }

    JUnit4์™€ JUnit5์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— JUnit5 ์‚ฌ์šฉ๋ฒ•์€ ๋”ฐ๋กœ ์„ค๋ช…์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    JUnit5 ์‚ฌ์šฉ๋ฒ• : https://math-coding.tistory.com/158

    • @Before : @Test ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
    • @After : @Test ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ, ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ release
    • @Test : @Before๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹ค์ œ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
    • @Rule : ํ•ด๋‹น Testํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ActivityTestRule๊ณผ ServiceTestRule ์ •์˜
    • @BeforeClass, @AfterClass : public static method๋กœ ์ •์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ „์ฒด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ์‹œ์ž‘ํ•  ๋•Œ์™€ ๋๋‚  ๋•Œ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
    • @Test(Timeout = ) : @Test ์— ๋Œ€ํ•œ timeout์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜์–ด timeout์•ˆ์— ํ…Œ์ŠคํŠธ ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž„ ์ดˆ๊ณผ์‹œ ์‹คํŒจ
    • @RequiresDevice : ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๊ธฐ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • @SdkSupress : minSdkVersion์„ ์ด์šฉ
    • @SmallTest, @MediumTest, @LargeTest : ํ…Œ์ŠคํŠธ ์„ฑ๊ฒฉ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ…Œ์ŠคํŠธ

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.