Android InstrumentationTestCase Part II

對於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());
}
}
作者

Nick Lin

發表於

2016-08-01

更新於

2023-01-18

許可協議


評論