對於Android 單元測試來說, 若滿足以下測試條件, 可選用 ActivityInstrumentationTestCase2 (Function Test) 來測試
(1) 針對單一Activity 測試, 不涉及其他Activity交互作用. (2) 對UI進行自動化測試 (3) 可對裝置使用程式來模擬輸入, 點擊 等UI 事件.
與ActivityUnitTestCase (Unit Test) 的最大不同點為: 可對裝置使用程式來模擬輸入, 點擊 等UI 事件.
Step 1: 建立測試檔
建立測試檔 MainActivityTest_AIT2 extends ActivityInstrumentationTestCase2
使用 Ctrl + Shift + T 建立測試檔, 並選擇 subclass 為 ActivityInstrumentationTestCase2
位置儲存於 /src/androidTest/java/ package_path /
Step 2: 初始化
建立測試元件
1 2 3 4 5 6 private Intent mStartIntent;MainActivity mMainActivity; private Button mTestButton;private EditText mEditText;private TextView mTextView;
建立Constructor
1 2 3 public MainActivityTest_AIS2 () { super (MainActivity.class); }
當每項測試前, 都會將測試元件初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Override protected void setUp () throws Exception { super .setUp(); mMainActivity = (MainActivity) getActivity(); mTestButton = (Button) mMainActivity.findViewById(R.id.test_bt); mEditText = (EditText) mMainActivity.findViewById(R.id.enter); mTextView = (TextView) mMainActivity.findViewById(R.id.show_text); } public void testPreconditions () { assertNotNull(mMainActivity); assertNotNull(mTestButton); assertNotNull(mEditText); assertNotNull(mTextView); assertNotNull(mMainActivity); }
Step 3: 對輸入框執行輸入
1 2 3 4 5 6 7 8 9 10 11 12 Instrumentation instrumentation = getInstrumentation();assertNotNull(instrumentation); instrumentation.runOnMainSync(new Runnable () { @Override public void run () { mEditText.requestFocus(); } }); instrumentation.waitForIdleSync(); instrumentation.sendStringSync("Click Test Button" ); instrumentation.waitForIdleSync();
Step 4: 點擊Test按鈕, 修改TextView
1 2 3 4 5 6 7 8 9 instrumentation.runOnMainSync(new Runnable () { @Override public void run () { mTestButton.requestFocus(); } }); instrumentation.waitForIdleSync(); instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER); instrumentation.waitForIdleSync();
Step 5: 執行測試
1 2 3 assertEquals("Click Test Button" , mEditText.getText().toString()); assertEquals("Click Test Button" , mTextView.getText().toString()); assertEquals(mEditText.getText().toString(), mTextView.getText().toString());
Source Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 public class MainActivityTest_AIT2 extends ActivityInstrumentationTestCase2 { MainActivity mMainActivity; private Button mTestButton; private EditText mEditText; private TextView mTextView; public MainActivityTest_AIT2 () { super (MainActivity.class); } @Override protected void setUp () throws Exception { super .setUp(); mMainActivity = (MainActivity) getActivity(); mTestButton = (Button) mMainActivity.findViewById(R.id.test_bt); mEditText = (EditText) mMainActivity.findViewById(R.id.enter); mTextView = (TextView) mMainActivity.findViewById(R.id.show_text); } public void testPreconditions () { assertNotNull(mMainActivity); assertNotNull(mTestButton); assertNotNull(mEditText); assertNotNull(mTextView); assertNotNull(mMainActivity); } @MediumTest public void testShowText () { Instrumentation instrumentation = getInstrumentation(); assertNotNull(instrumentation); instrumentation.runOnMainSync(new Runnable () { @Override public void run () { mEditText.requestFocus(); } }); instrumentation.waitForIdleSync(); instrumentation.sendStringSync("Click Test Button" ); instrumentation.waitForIdleSync(); instrumentation.runOnMainSync(new Runnable () { @Override public void run () { mTestButton.requestFocus(); } }); instrumentation.waitForIdleSync(); instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER); instrumentation.waitForIdleSync(); assertEquals("Click Test Button" , mEditText.getText().toString()); assertEquals("Click Test Button" , mTextView.getText().toString()); assertEquals(mEditText.getText().toString(), mTextView.getText().toString()); } }