Android ๋จ์ํ ์คํธ์ ๋ํ์ฌ
์์ฑ์ : ๋ฐํ์
Present Time : 2018โ06-27-WED
Last Updated :
ํ ์คํธ์ ์ฌ์ ์ ์๋ฏธ
-
์ ํ์ ์ฑ๋ฅ์ด๋ ์ํ ๋ฐ์๋ฅผ ์ผ์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ ๊ฒ์ฌํจ.
-
์ผ์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ ๊ฒ์ฌํ๋ค.
์ํํธ์จ์ด์ ํ ์คํธ
-
์ํํธ์จ์ด์ ๊ฒฐํจ์ด ์กด์ฌํจ์ ๋ณด์ด๋ ๊ณผ์ ์ด๋ค.
-
์ํํธ์จ์ด ๋ฌธ์ ๊ฐ ์๋ค๋ฅผ ๋ณด์ด๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์ ๊ฐ ์๋ค๋ฅผ ๋ฐํ๋ ๊ณผ์ ์ด๋ค.
-
์์คํ ์ด ์ ํด์ง ์๊ตฌ๋ฅผ ๋ง์กฑํ๋์ง, ์์๊ณผ ์ค์ ๊ฒฐ๊ณผ๊ฐ ์ด๋ค ์ฐจ์ด๋ฅผ ๋ณด์ด๋์ง ์๋ ๋๋ ์๋ ๋ฐฉ๋ฒ์ ๋์ํ์ฌ ๊ฒ์ฌํ๊ณ ํ๊ฐํ๋ ์ผ๋ จ์ ๊ณผ์ ์ด๋ค.
-
ํ์ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธ
-
์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌ
-
์ฑ์ ์ฌ์ฉ์ฑ์ ํ์ธ
-
๋ฑ
ํ ์คํธ๋ ์๋ ํ ์คํธ์ ์๋ํ ์คํธ๋ก ํฌ๊ฒ ๋๋ก ๋๋ ์ ์๋ค.
์๋ ํ ์คํธ๋ ์ฝ๋ฉ ์์ ์ด ๋๋ ์ํ์์ apk ๋ฅผ ๋ง๋ค๊ณ , ์ฒดํฌ๋ฆฌ์คํธ๋ก ์์ฑํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฐจ๋ก๋๋ก ์คํํ๋ ํํ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ฐ๋ฉด ์๋ํ ์คํธ๋, ๋จ์ ํ ์คํธ๋ UI ํ ์คํธ๋ก ๋ถ๋ฆฌ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค์ด ํ ์คํธ ์ฝ๋๋ฅผ ์คํํจ์ผ๋ก์จ ์ฑ์ด ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธ ํ๋ค.
์๋ ํ ์คํธ์ ํน์ฑ
- ๋ฐ๋ณต ์คํ์ด ๊ฐ๋ฅ
- ํ ์คํธ ์คํ ์ํฉ์ ์๊ฐํ ํ ์ ์๋ค.
- ํด๋์ค์ ๋ฉ์๋ ๋ฑ ์ฌ์ฉ์ ์กฐ์์ผ๋ก ํ์ธํ๊ธฐ ์ด๋ ค์ด ๋จ์์ ๋์์ ํ์ธํ ์ ์๋ค.
์๋ ํ ์คํธ์ ํน์ฑ
- ์ต์ข ์ฌ์ฉ์์ ์์ ํ ๋๊ฐ์ด ๋์์ ํ์ธํ ์ ์๋ค.
- ์ฌ์ฉ์ฑ์ด๋ ์พ์ ํจ ๋ฑ ์ ์ฑ์ ์ธ ๋ฉด์์ ํ๊ฐํ ์ ์๋ค.
- ํ ์คํธ ํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ธ ์ฌ๋ฌ๋ถ์ด ๋ค๋ฅด๊ฒ ์๊ฐํ ์ ์๋ ๊ธฐํ์ด๊ธฐ๋ํ๋ฉฐ ์๋ฌต์ ์ผ๋ก๋ ์ฝ๋๋ฅผ ๋ ๊น๋ํ ์์ฐํ ์ ์๊ฒ๋ ํ๋ค.
- ํ ์คํธ๋ฅผ ๊ฑฐ์น๋ฉด ๊ฐ๋ฐ์๋ ์ฝ๋์ ๋ ์์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- ๋น๋๋ ์ด๋ก์ ์ํ๋ฐ์ ๋ฆฌํฌํธ์ ์์ธ ๋ด์ฉ์ ํ ์คํธ ๋ณด๊ณ ์๋ฃ๊ฐ ๋๋ค.
- ์๋ํ ํ ์คํธ์์ ๋ฒ๊ทธ๋ฅผ ๋จผ์ ์ก์๋ด๊ธฐ์ ๋ฆฌ๊ทธ๋ ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค. ์ด ์ค ๋ฆฌ๊ทธ๋ ์ ํ ์คํธ๊ฐ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๊ฐ๋ ๋ถ๋ถ์ผ๋ก, ์ฌ๋ฌ๋ถ์ด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ณ ๋ค์ ํ ์คํธ๋ฅผ ํจ์คํ์๋ ์์ ๊ฐ ์์น์ ๋น์ฐํ ์ผ์ด๊ฒ ์ฃ ?! ํ ์คํธ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ํ ์คํธ๋ฅผ ํ ์ฆ์ ๊ทธ ํจ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค๊ธฐ ๋ณด๋ค ์๋ฌด๋๋ ๋ช ๋ฌ(;)์ ์ง๋๊ณ ๋ฆฌํฉํ ๋ง์ด ํ์ํด์ ธ์ผ ์ ์ ์๋ค๋ ์ ์ด๋คโฆ
๊ณต์ ๊ณผ ์๊ตฌํ๋ ํ์ง, ์คํ ๋ฐฉ๋ฒ, ๊ธฐ๋ฒ ๋ฑ ๋ค์ํ ๊ด์ ์ ๋ฐ๋ผ ํ ์คํธ์๋ ์๋ง์ ์ข ๋ฅ๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด, 'V๋ชจ๋ธ' ์์๋ ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ์์คํ ํ ์คํธ, ์ธ์ ํ ์คํธ ๊ฐ์ ๊ณต์ ๋ณ ํ ์คํธ๋ฅผ ๋ณผ ์ ์๋ค. ๋ํ ๊ทธ ๋ฐ์๋ ํ์ดํธ๋ฐ์ค ํ ์คํธ, ๋ธ๋๋ฐ์ค ํ ์คํธ, ๋ถํ ํ ์คํธ, ์ฑ๋ฅ ํ ์คํธ ๋ฑ๋ฑ ๋ง์ ์ข ๋ฅ๊ฐ ์๋ค.
*** ์๋๋ก์ด๋ ์ฑ์ ํ ์คํธ ๊ณ์ธต ์ฌ์ง** (ํ ์คํ ์ ํผ๋ผ๋ฏธ๋)
๊ธฐ๋ณธ์ ์ผ๋ก ํ ์คํธ ์ผ์ด์ค์ ์๋ ์คํ ํ์ (์คํ ํ์ด๋ฐ)๋ '๋จ์ํ ์คํธ'๊ฐ ๊ฐ์ฅ ๋ง๊ณ , '๊ทธ ๋ฐ์ ํ ์คํธ'๊ฐ ๊ฐ์ฅ ์ ๋ค. ์๋๋ก ๊ฐ ์๋ก ๋ง์์ง๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฌ์ง์ผ๋ก ์ ๋ฆฌํ ์ ์๋ค.
์ตํ์ธต์ ๋จ์ํ ์คํธ๋ ํด๋์ค๋ ๋ฉ์๋์ฒ๋ผ ์์ฃผ ์์ ๋จ์๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด ์คํ๋๋ ํ ์คํธ์ด๋ค. ๋จ์ ํ ์คํธ๋ ๊ฐ์ฅ ์์ ๋จ์๋ก ๊ฒ์ฆ์ด๋ ์คํ์ด ์ด๋ฃจ์ด ์ง๋ฏ๋ก ์คํ ์๊ฐ๋ ์์ฃผ ์งง๋ค.
๋ค์ ๊ณ์ธต์ ์๋ UI ํ ์คํธ๋ ์ค์ ๋์ ํ๊ฒฝ์ ์ค์์ ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก๋ ์ค์ ๊ธฐ๊ธฐ๋ ์๋ฎฌ๋ ์ดํฐ ์์์ ์คํ๋๋ค. UIํ ์คํธ๋ผ๋ ์ด๋ฆ ๊ทธ๋๋ก ๋จ๋ง์ ํ์๋ฅผ ๋ฐํ์ผ๋ก ํ์ธํด ๊ฐ๋ค.
๋๋จธ์ง 2๊ณ์ธต์ธ ์ธ์ ๊ณ์ธต๊ณผ ๊ทธ ๋ฐ์ ํ ์คํธ์์๋ ์ฌ์์ ๋ง์กฑํ๋์ง, ์ฌ์ฉ์ฑ์ ๋ฌธ์ ๋ ์๋์ง์ ๊ฐ์ ์ ์ฑ์ ์ธ ์ฌํญ์ ํฌํจํ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ค. ๊ธฐํ ํ ์คํธ์ ์ผ๋ถ๋ก์ ์ฑ๋ฅ ํ ์คํธ๋ ๋ณด์ ํ ์คํธ๋ฅผ ๋ค ์ ์๋ค.
ํ๋ก๊ทธ๋จ์ ์์ฑํ ํ์ ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค์ ๋ฉ์๋ ๋จ์๋ก ๊ธฐ๋ฅ์ ํ ์คํธ
๋จ์ ํ ์คํธ๋ ํน์ ๋ชจ๋์ด ์๋ํ ๋๋ก ์ ๋์ํ๋๊ฐ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด๋ค. ์ฆ, ๋ชจ๋ ํจ์์ ๋ฉ์๋์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ์ ์ฐจ๋ฅผ ๋งํ๋ค.
๊ด๋ จ ํด: JUnit, Mockito, PowerMock
๋ฒ์ธ ) UI ํ ์คํธ ๊ด๋ จ ํด: Espresso, UIAutomator, Robotium, Appium, Calabash, Robolectric
- ๋ด ์ฝ๋๊ฐ ์ ๋๋ก ๋์ํ๋์ง ํ์ธํ๋ ๊ฒ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋(ํจ์/๋ฉ์๋) ๋ฅผ ๋ ์๊ฒ ๋ง๋ ๋ค. -> ์ฝ๋๋ฅผ ์ดํดํ๊ณ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๋ฉฐ, ๋ณํ์ํค๋ ๊ฒ ๋ํ ์ฝ๋๋ก ํ๋ค. ์ฝ๋์ ๋จ์๋ ์์ ์๋ก ์ข๋ค.
- ๋ฌธ์ ๋ฅผ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํ๊ณ ๋ณํ๋ฅผ ์ฝ๊ฒํ๋ฉฐ ํตํฉ์ ๊ฐ๋จํ๊ฒ ํ๊ณ ์ค๊ณ๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
์ด์์ ์ผ๋ก, ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ์๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ๊ฐ์ง ๊ฐ์ฒด (Mock object) ๋ฅผ ์์ฑํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
์๋๋ก์ด๋ ๋จ์ ํ ์คํธ์๋ JUnit ์ด๋ผ๋ ํ๋ ์์ํฌ๊ฐ ์ฌ์ฉ๋๋ค. JUnit์ ์๋ฐ์ฉ ๋จ์ํ ์คํธ ์์ฑ์ ์ํ ์ฐ์ ํ์ค ํ๋ ์์ํฌ ์ด๋ค.
ํด๋น ํจ์์ ๋ํ ์คํ ์๊ฐ์ ํ์ํด ์ค๋ค.
-
JUnit์์ ํ ์คํธ์ ์ฑ๊ณต ์คํจ๋ฅผ ํ๋จํ๋๋ก ํ๋ ๋ฌธ์ฅ์ ๋จ์ ๋ฌธ์ด๋ผ ํ๋ค.
-
Method ์ค๋ช ๋น๊ณ (์์) assertEqaul(expected, actual) ๋ ๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๋ ๋จ์ ๋ฌธ assertEqual(10, Calculator.add(2,8)) assertSame ๋ ๊ฐ์ฒด๊ฐ ์ ๋ง ๋์ผํ ๊ฐ์ฒด์ธ์ง ์ฃผ์๊ฐ์ผ๋ก ๋น๊ตํ๋ ๋จ์ ๋ฌธ assertTrue ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ธ์ง ํ๋ณํ๋ ๋จ์ ๋ฌธ boolean๊ฐ์ ๋ฆฌํดํ๋ ๋ฉ์๋๋ฅผ ํ ์คํธํ๊ธฐ ์ ํฉ (assertTrue,assertFalse ๋๋ค) assertFalse ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ง์ธ์ง ํ๋ณํ๋ ๋จ์ ๋ฌธ assertFalse(Calculator.isInteger("abc")) assertNull ๋์ ๊ฐ์ด null์ด๋ฉด ์ฐธ์ด ๋๋ ๋จ์ ๋ฌธ assertNull(textFile) assertNotNull ๋์๊ฐ์ด null์ด ์๋๋ฉด ์ฐธ์ด ๋๋ ๋จ์ ๋ฌธ assertNotNull(textFile) fail([message]) ํธ์ถ ์ฆ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํจ๋ก ํ์ ํ๋ ๋จ์ ๋ฌธ fail ๋จ์ ๋ฌธ ํ์ฉ์ฌ๋ก
-
Ex) @Override, SuppressWarnings
์ด๋ ธํ ์ด์ ์ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋์ง๋ง ๋ฉํ ๋ฐ์ดํฐ๋ก์์ ์ฉ๋๊ฐ ๊ฐ์ฅ ํฌ๋ค ํ ์ ์๋ค.
๋ฉํ๋ฐ์ดํฐ : ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธ, ํ ๋ฐ์ดํฐ์ ๋ํ ์ค๋ช ์ ์๋ฏธํ๋ ๋ฐ์ดํฐ (์์ ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ)
โ
JUnit4์์ ๋ถํฐ ํ ์คํธ ์ฝ๋์ ์ด๋ ธํ ์ด์ ์ด ์ด์ฉ๋๋ค.
-
Annotation ์ค๋ช ๋น๊ณ @Test ํ ์คํธํ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค. @Test(timeout=1000)//1์ด ์ด๊ณผ์ ์๋ฌ@Test(expected = RuntimeException.class) //์์ธ ์์ @Ignore ๋ฌด์. ๋จ์ํ ์คํธ์์ ์ ์ธ๋๋ค. @BeforeClass ํ ์คํธ ํด๋์ค ์คํ ์ ์ ํ๋ฒ ์ํ๋๋ ๋ฉ์๋ ์์ ์ ์ธํ๋ค. @AfterClass ํ ์คํธ ํด๋์ค ์คํ ํ์ ํ๋ฒ ์ํ๋๋ ๋ฉ์๋์์ ์ ์ธํ๋ค. @Before ๋ค์์ ๋์ค๋ @Test ์คํ ์ ์ ์คํ๋๋ ๋ฉ์๋์์ ์ ์ธํ๋ค. @After ์ด์ ์ ๋์จ @Test ์คํ ํ์ ์คํ๋๋ ๋ฉ์๋์์ ์ ์ธํ๋ค.
-
public class Calculator { public static int add(int a, int b) { return a + b; } public static int subtract(int a, int b) { return a - b; } public static int multiply(int a, int b) { return a * b; } public static double division(int a, int b) { return a / b; } }
-
Caculator ํด๋์ค์ ์ปค์๋ฅผ ๋๊ณ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ํด๋ฆญ -> [GoTo -> Test] -> [Create New Test]
Create New Test๋ฅผ ํด๋ฆญํ๋ฉด ์ ๋ฐ ์ฐฝ์ด ๋น๋๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ํ๋ ๋ฉ์๋๋ฅผ ์ ํ
OK๋ฅผ ๋๋ฅด๋ฉด ๋๋ ํ ๋ฆฌ๋ฅผ ์ ํํ๋ ์ฐฝ์ด ๋์ค๋๋ฐ, com(test) ๋ฅผ ์ ํํ๋ค. (๊ทธ ์ด์ ๋ ํ๋จ์ [์ฐธ๊ณ ] ๋ฅผ ์ฐธ๊ณ ํ์ธ์.)
[์ฐธ๊ณ ] com(androidTest) ๋ผ๊ณ ํ์๋ ๋๋ ํ ๋ฆฌ๋ UIํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ณณ์ด๊ณ ,
โ com(test) ๋ผ๊ณ ํ์๋ ๋๋ ํ ๋ฆฌ๋ ๋จ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณณ์ด๋ค.
-
androidTest : Android Instrumentation ํ ์คํธ๋ก ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ๋ ์ค๋ฌผ ๋๋ฐ์ด์ค์์ ํ ์คํธ๋ฅผ ์ํํ ์ ์๋ค.
-
test : ์ ๋ ํ ์คํธ๊ฐ ์์นํ๋ ๊ณณ์ผ๋ก ์ฌ๋ฌ๋ถ์ ๋ก์ปฌ ๋จธ์ ์ JVM์์ ์ํ๋๋ฉฐ ์๋ฎฌ๋ ์ดํฐ๋ ์ค๋ฌผ ๋๋ฐ์ด์ค์์ ๋๋ฆด ์ ์๋ค. ์ฆ, ์ด ํ ์คํธ๋ก๋
Context
์ ๊ฐ์ ์๋๋ก์ด๋ ํด๋์ค์ ์ ๊ทผํ ์ ์๋ค.โ
-
public class CalculatorTest { // ์ด๊ธฐํ ์ ํ๋ฒ ํธ์ถ๋๋ ๋ฉ์๋ @Before public void setUp() throws Exception { } // ํ ์คํธ ์๋ฃ ์์ ํธ์ถ๋๋ ๋ฉ์๋ @After public void tearDown() throws Exception { } @Test public void add() throws Exception { assertEquals(10, Calculator.add(2,8)); } @Test public void subtract() throws Exception { assertEquals(4, Calculator.subtract(10,6)); } @Test public void multiply() throws Exception { assertEquals(0, Calculator.multiply(0,10)); assertEquals(10, Calculator.multiply(1,10)); } @Test public void division() throws Exception { assertEquals(2.5, Calculator.division(5,2),0); //์ธ๋ฒ์งธ ์ธ์: ์ค์ฐจ ํ์ฉ์น assertEquals(2, Calculator.division(4,2),0); } }
-
๋ฌธ๋ฒ์ ์ผ๋ก ํจ์๋ช ํ๊ธ๋ ๊ฐ๋ฅ.
-
๊ฐ ํจ์๋ ํด๋์ค ์์ ์๋ ์คํ๋ฒํผ์ ํด๋ฆญํด ํ ์คํธ๋ฅผ ์ํํ๋ค.
ํ๋จ์ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ค.
- ์๋๋ก์ด๋ ๊ฐ๋ฐ ๋ ๋ฒจ์ ๊ต๊ณผ์ (์ฏ์ฏ์ด ์์ค์ผ ์ธ 5๋ช ์ง์)
- ๋ ๋๊น์ง ์๋๋ก์ด๋ (์ค์ค์ ์ง์) - 30์ฅ.1. ๋จ์ํ ์คํธ ๋ถ๋ถ ์ฐธ๊ณ