因為我是測試出身,剛轉來做手機開發,寫了幾天代碼,所以這幾天總是蠢蠢欲動的想寫的東西,考慮都老本行,所以決定寫一篇如何做Android 單元測試,下來就開始我的第一個Android的測試工程:
- 一些資源:
- Google的開發文檔,不過要翻牆才能看的到,不過有很多地方都可以下載到離線的包。
- 剩下的就是Android的開發環境,請參考開發文檔自己配置。
- 下面先建立一個Android的工程,裡面按照正常的開發過程實現一些功能, 我有一個工程裡面實現的Android聯絡的一些操作,因為我也需要驗證我的這些操作是否真正的有效,開始我是在介面上添加了一個測試按鈕,將一些調用方法寫在這個按鈕裡,每測試完一個功能就把這個按鈕裡面的實現刪掉,再寫新的代碼,這樣做十分不方便,也破壞了原有的軟體“功能”,反正都要測試,為什麼不寫真正的測試代碼呢?而且寫測試代碼也是我的老本行,下面就開始真正的測試代碼:
- 建立一個Test工程:點擊菜單“File->New->Project”,然後選擇Android Test Project然後填入測試工程的名稱,選擇被測試的工程,就建好測試工程了。
- 建好測試工程後,可以看到測試工程的結構的一般的開發工程是差不多的,然後在測試工程的包下面建立一個JUnit Test Case, 寫好測試案例的名稱這裡我們選擇New JUnit 3 Test, setUp()和tearDown()也打上勾,當然你也不打勾,後面直接在測試代碼裡寫上就是了。
- 建立立的測試類別是基於TestCase類的,但是我們測試過程中要用到軟體的一些“功能”,所以我們要做一點點的修改如下:
1:
2: public class TestPersonCantact extends ActivityInstrumentationTestCase2<MainActivity> {
3:
4: private Context ctx;
5:
6: public TestPersonCantact(String pkg, Class<WebShare> activityClass) {
7: super("com.android.contaxt", WebShare.class);
8: // TODO Auto-generated constructor stub
9: }
10:
11: public TestPersonCantact() {
12: super("com.android.contact", WebShare.class);
13: }
14:
15: protected void setUp() throws Exception {
16: super.setUp();
17: ctx = getActivity();
18:
19: }
20:
21: protected void tearDown() throws Exception {
22: super.tearDown();
23: }
- 這裡就完成了測試案例的準備工作了,記得這兩個建構函式要寫對了,不然會有問題。接下來就開始寫我們的測試案例了,因為是第一次用JUnit, 發現它測試案例和Python的有點像,函數名格式為testXXXX()就可以了,而在Gtest裡面是用一個宏來表示的,好了寫一個方法如:
1: public void testDeletePersonContact() throws NoIdException {
2: ContactsHelperhelper = new ContactsHelper(ctx);
3: PersonContact one = PersonContact
4: .newPersonContact("TestPersonContact@gmail.com");
5: PersonName name = PersonName.newPersonName("FirstName", "LastName",
6: null, null, null);
7: TelephoneNumber tel = TelephoneNumber.newTelephoneNumber("123123123",
8: 3, null);
9: TelephoneNumber tel2 = TelephoneNumber.newTelephoneNumber("1231231230",
10: 1, null);
11:
12: one.name = name;
13: one.addTelephoneNumber(tel);
14: one.addTelephoneNumber(tel2);
15:
16: //... Email, ...
17: try {
18: helper.add(testGuy);
19: } catch (RemoteException e) {
20: // TODO Auto-generated catch block
21: e.printStackTrace();
22: } catch (OperationApplicationException e) {
23: // TODO Auto-generated catch block
24: e.printStackTrace();
25: }
26:
27: PersonContact pc = helper.getPersonContactById(one.id);
28:
29: try {
30: helper.delete(pc);
31: } catch (RemoteException e) {
32: // TODO Auto-generated catch block
33: e.printStackTrace();
34: } catch (OperationApplicationException e) {
35: // TODO Auto-generated catch block
36: e.printStackTrace();
37: }
38:
39: PersonContact pc1 = helper.getPersonContactById(pc.id);
40: this.assertEquals("telephoneNumbers after Delete Count Is:" + pc1.telephoneNumbers.size(), pc1.telephoneNumbers.size(), 0);
41: // ...
42: }
JUnit也提供了很多assertEquals, assertTrue之類的方法,可以讓我們很快的完成測試案例代碼的實現,我一口氣寫幾個看看運行效果如下:
看著一道美麗的綠條,心裡真是開心哈。
建立大家在寫代碼的時候,也養成寫測試代碼的習慣,可以把自己寫的很多零散的測試代碼很好的組織、歸檔,別人看了你的測試代碼後就知道你的介面怎麼調用,根本不用你再為別人講一次這個介面需要如何如何用?這樣不是很好麼^_^