在上一篇 Create android test project by command line and eclipse 中我們建立被測專案(TargetTestProject)以及測試專案(TestProject),並在測試專案中加入一個測試Activity的 Test Case(MainActivityTest)。
但 MainActivityTest 不算是一個真正的 Test Case,因為裡面沒有任何測試案例。
因此本篇紀錄如何加入測試案例以及測試Activity的基本模板。
加入測試案例相當簡單,因為 android test framework 使用 Junit3,而 Junit3 會將所有公開,無回傳值並以 test 開頭的方法都認為是測試案例,e.g. public void testXXX()
因此在MainActivityTest 加入以下代碼,即為一個測試案例。
public void testPrecondition() { fail("test Precondition"); }
testPrecondition 會是基本模板中的一部分,裡面主要是測試所有前置條件是否通過。
而 fail(“test Precondition”),代表測試程式執行到這一定會失敗並印出提示內容。
接著執行測試專案,會看到以下輸出
test: [echo] Running tests ... [exec] [exec] com.example.targettestproject.MainActivityTest: [exec] Failure in testPrecondition: [exec] junit.framework.AssertionFailedError: test precondition [exec] at com.example.targettestproject.MainActivityTest.testPrecondition(MainActivityTest.java:36) [exec] at java.lang.reflect.Method.invokeNative(Native Method) [exec] at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) [exec] at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) [exec] at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) [exec] at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:192) [exec] at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:177) [exec] at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) [exec] at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1619) [exec] [exec] Test results for InstrumentationTestRunner=.F [exec] Time: 0.493 [exec] [exec] FAILURES!!! [exec] Tests run: 1, Failures: 1, Errors: 0 [exec] [exec] BUILD SUCCESSFUL Total time: 19 seconds
輸出的內容有點多,但重要的只有第6行 test precondition,代表測試程式目前如我們所預期的執行動作。
接著加入測試Activity的基本模板。
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { private MainActivity mMainActivity; public MainActivityTest() { super("com.example.targettestproject", MainActivity.class); } protected void setUp() throws Exception { super.setUp(); mMainActivity = getActivity(); } protected void tearDown() throws Exception { super.tearDown(); } public void testPrecondition() { assertNotNull(mMainActivity); } }
第3行的 mMainActivity 即為被測專案的 MainActivity,我們需要一個欄位來保存它,因為之後需要藉由它取得其他元件。
第9行的 setUp 會在 ” 每個 ” 測試案例執行前呼叫,主要做初始化的動作,包含建立物件等等,因此可以看到mMainActivity 也在這裡初始化。
第15行的 tearDown 相對於 setUp,會在每個測試案例結束後執行,若測試案例有需要釋放資源,銷毀物件如 Service, ContentProvider 等等,請在這裡將他們指定為Null。
第20行測試前置條件 mMainActivity 不可為 Null。
以上即為測試Activity的基本模板。
若在各個函式之間加入log觀察執行順序,如下
private static final String DEBUG_TAG = MainActivityTest.class.getSimpleName(); protected void setUp() throws Exception { super.setUp(); mMainActivity = getActivity(); Log.d(DEBUG_TAG, "in setUp"); } protected void tearDown() throws Exception { super.tearDown(); Log.d(DEBUG_TAG, "in tearDown"); } public void testPrecondition() { assertNotNull(mMainActivity); Log.d(DEBUG_TAG, "in testPrecondition"); }
輸出如下
D/MainActivityTest( 9367): in setUp D/MainActivityTest( 9367): in testPrecondition D/MainActivityTest( 9367): in tearDown
可以看到 setUp 會在 testPrecondition 之前呼叫,而 tearDown 會在 testPrecondition 之後呼叫。
下一篇會在被測程式加入 UI 功能並在測試程式加入相對應的測試案例。