-
[Android] Unit Test, JUnit4Android 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 : ํ ์คํธ ์ฑ๊ฒฉ ๊ตฌ๋ถํ์ฌ ํ ์คํธ
๋ฐ์ํ'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Drawble layer-list (0) 2021.08.15 [Android] Robelctric Test๋ (0) 2021.02.17 [Android] ์๋๋ก์ด๋ ์คํ๋์ค NDK ์ฌ์ฉ๋ฒ (0) 2021.02.12 [Java] ์๋ฐ ์ฐ๋ ๋์ ๋๊ธฐํ (0) 2021.02.07 [Android] Broadcast? Broadcast Receiver๋? (0) 2021.01.08