-
[Android] Robelctric Test๋Android 2021. 2. 17. 09:35๋ฐ์ํ
Android Test
Local Unit Test
ํ ์คํธ ์คํ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ์คํธ์ธ ์ ๋ ํ ์คํธ๋ JVM์์ ์คํ๋ฉ๋๋ค.
Unit Test๋ฅผ ์ํํ๊ธฐ ์ํด์๋ module-name/src/test/java ํด๋์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์๋๋ก์ด๋ ํ๋ ์์ํฌ ์ข ์์ฑ์ด ์๋ ํ ์คํธ ์ฝ๋์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ฝ Android ์ปดํฌ๋ํธ๋ค์ Unit Test ์ฝ๋์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ ์คํธ๋ ์คํจํฉ๋๋ค. Unit Test์์ ์ฌ์ฉํ๋ ์๋๋ก์ด๋ ์ปดํฌ๋ํธ๋ค์ android-stubs-src.jar ํ์ผ์ ์ฐธ์กฐํ๋๋ฐ ์ค์ ์ด ํ์ผ๋ค์ ๋น ๊ป๋ฐ๊ธฐ๋ค๋ง ๋ชจ์ฌ ์์ด ์คํ๋ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด Instrumentation Test๊ฐ ํ์ํ ์ด์ ์ ๋๋ค.
Instrumentation Test
Instrumentation Test๋ ํ๋์จ์ด ๊ธฐ๊ธฐ๋ ์๋ฎฌ๋ ์ดํฐ์์ ์คํํ๊ธฐ ์ํ ํ ์คํธ์ ๋๋ค.
์ด ํ ์คํธ๋ ์๋๋ก์ด๋ ํ๊ฒฝ์์ ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ํ ์คํธํ ์ฑ์ Context์ ๊ฐ์ ์ ๋ณด์ ์ ๊ทผํ ์ ์๋ Instrumentation API์ ์ก์ธ์คํ ์ ์์ต๋๋ค. Android ํ๊ฒฝ์์ ์คํ๋๋ AndroidJUnitRunner๋ฅผ ํตํด์ ์คํ๋ฉ๋๋ค.
Instrumentation Tesat๋ฅผ ์ํํ๊ธฐ ์ํด์๋ module-name/src/test/java ํด๋์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
Instrumentation Test๋ Unit Test์ ๋นํด ์ฑ์ ๋น๋ -> ๋ฐฐํฌ -> ์คํ ์ํค๋ ๊ณผ์ ์ด ๋งค ํ ์คํธ๋ง๋ค ํฌํจ๋์ด ์์ด์ ์๋์ ์ผ๋ก ํ ์คํธ ์๋ฃ๋๊ธฐ๊น์ง ์๋๊ฐ ๋๋ฆฝ๋๋ค.
Robolectric
RObolectri์ ๋น ๋ฅด๊ณ ์ ๋ขฐ์ฑ ๋์ ๋จ์ ํ ์คํธ๋ฅผ ์๋๋ก์ด๋์ ์ ๊ณตํ๋ ํ๋ ์ ์ํฌ์ ๋๋ค. Instrumentatino Test๋ฅผ ๋ณด์ํ๊ณ ์ ๋ง๋ ํ๋ ์์ํฌ๋ก ์ ๋ํ ์คํธ์์ Insturmentation API์ ์ ๊ทผํ์ฌ ์๋๋ก์ด๋ ํ๋ ์์ํฌ์ ์์กด์ฑ์ด ์๋ ์ฝ๋๋ค์ ์ ๋ ํ ์คํธ๋ก ์์ฑํ ์ ์์ต๋๋ค.
- Robolectric์ ์ด์ฉํ Unit Test ์คํ
- RobolectircTestRunner๊ฐ JVM์ ํํน
- Class Loader๊ฐ Adnroid Componet ๋ก๋๊ฐ ์๋ Robolectric์ Shadow ๊ฐ์ฒด ๋ก๋ฉ
์ผ๋ฐ์ ์ผ๋ก ์ ๋ ํ ์คํธ์์๋ Android ์ฝ๋๊ฐ ์์ ๋, android-stubs-src.jar๋ฅผ ์ฐธ์กฐํ์ง ์์ง๋ง, Robolectric์ ์์ฒด์ ์ผ๋ก android.jar ์ ํ๋์ Shadowing์ ํ๊ฒ ๋ฉ๋๋ค.
Gradle ์ค์
android { testOptions { unitTests { includeAndroidResources = true } } } dependencies { testImplementation 'org.robolectric:robolectric:4.4' }
build.gradle์ ๋ค์๊ณผ ๊ฐ์ defaultConfig์ testOptions.uniTests.includeAndroidResources๋ฅผ ์ถ๊ฐํ๊ณ robolectric ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ถ๊ฐํฉ๋๋ค. Robolectric ์ฌ์ฉ์ ์ฃผ์ํ ์ ์ SdkVersion์ด 29์ด์์ด ๋๋ฉด ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต๋ 28๊น์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
android.enableUnitTestBinaryResources=true
ํด๋น๋๋ ๋ช ๋ น์ด๋ฅผ gradle.properies์ ์ถ๊ฐํด์ผ ํ์ง๋ง Android Studio 3.3 ์ด์๋ถํฐ๋ ํ ํ์๋ ์์ต๋๋ค.
Main ์ฝ๋
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.change_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }); } public int tesetMethod(int a,int b){ return a+b; } }
Test ์ฝ๋
1. Log -> System.out Test
@RunWith(RobolectricTestRunner.class) public class RobolectricTest { // Android.util.Log๋ฅผ System.out ์ถ๋ ฅ @Before public void setUp() throws Exception { ShadowLog.stream = System.out; } @Test public void logTest(){ System.out.println("hello RobolectricTest"); Log.d("TAG","Log.d change sysout"); } }
2. Activity change Test
@Test public void changeAcitivityTest(){ MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().get(); activity.findViewById(R.id.change_btn).performClick(); Intent intent = new Intent(activity,SecondActivity.class); Intent actual = Shadows.shadowOf(activity).getNextStartedActivity(); Assert.assertEquals(intent.getComponent(),actual.getComponent()); }
3. LifeCycle Test
@Test public void lifecycleActivityTest(){ ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class); controller.create().start().resume().stop().destroy(); Assert.assertEquals(true, controller.get().isDestroyed()); }
4. Android Component(TextView) Test
@RunWith(RobolectricTestRunner.class) public class RobolectricTest { MainActivity activity; @Before public void setUp() throws Exception{ ShadowLog.stream = System.out; activity = Robolectric.buildActivity(MainActivity.class) .create() .resume() .get(); } @Test public void textViewTest(){ TextView textView = activity.findViewById(R.id.textView); Assert.assertEquals("Hello World!",textView.getText()); } }
๋ฐ์ํ'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Activity๋? Activity LifeCycle ์๋ฒฝ ์ดํด (0) 2021.11.03 [Android] Drawble layer-list (0) 2021.08.15 [Android] Unit Test, JUnit4 (0) 2021.02.16 [Android] ์๋๋ก์ด๋ ์คํ๋์ค NDK ์ฌ์ฉ๋ฒ (0) 2021.02.12 [Java] ์๋ฐ ์ฐ๋ ๋์ ๋๊ธฐํ (0) 2021.02.07