Android測試驅動開發實踐1
在正式進行Android測試驅動開發之前,不得不先提一下Android應用架構問題。在傳統軟件開發中,MVC架構得到了廣泛的應用,然而在Android開發中,很少見應用采用了MVC架構(不要說Android及Widget全部采用的是MVC架構,那是系統的事,我們講的是應用程序開發),究其原因可能是初期Android應用大多較為簡單,沒有采用的必要,而后期一直在沿用初期的習慣。但是遇到一些復雜的應用,例如同樣的數據在多個Activity中顯示,如果數據分散在多個Activity中,那么數據發生更新,很有可能出現數據不一致的情況,尤其是Android應用為節省帶寬大量使用緩存的情況下,這種情況更加突出。我所經歷的項目中,大部分項目都或多或少存在這個問題。因此,采用MVC架構開發Android應用程序也許是一個值得嘗試的方法。所以,在這里我們也會采用MVC架構來做應用程序的開發,雖然我們的架構未必在理論上很完備,也不一定能解決實際應用中的所有問題,但是采用MVC架構的的確確可以提高程序的質量,同時也會使程序的可測試性大大增強。
言歸正傳,我們現在就開測試驅動開發。
首先建立一個Android工程,例如wkj,然后建立一個Android測試工程如WkjTest,這樣就構成了一個Android測試開發的起點,下面就讓我們正式開始Android測試驅動開發吧!
我們開始編寫第一個測試用例,由于是空工程,我們首先要測試的是MainActivity正確顯示出AppModel所提供的應用名稱-維康街。什么?Android創建的工程顯示的是Hello World,怎么會是維康街?而且AppModel是個什么東西?細心的讀者的這些問題沒錯,這就是測試驅動開發的工作模式:先寫出失敗的測試程序,然后再通過編程來通過這些測試用例。
打開WkjTest工作,創建新類MainActivityTest,并指定該類繼承自android.test.ActivityInstrumentationTestCase2,代碼如下所示:
package com.bjcic.wkj.test; import com.bjcic.wkj.MainActivity; import android.app.Activity; import android.test.ActivityInstrumentationTestCase2; import android.widget.TextView; public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { public MainActivityTest() { super(MainActivity.class); } /** * 每個測試用例開始運行前必須執行的代碼 */ @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); activity = getActivity(); } /** * 每個測試用例運行結束時必須執行的代碼 */ @Override protected void tearDown() throws Exception { super.tearDown(); } /** * 測試界面上標題文字為:維康街 */ public void testTemp001() { titleTxtv = (TextView)activity.findViewById(com.bjcic.wkj.R.id.j_titleTxtv); assertEquals(activity.getString(com.bjcic.wkj.R.string.welcome_msg), titleTxtv.getText()); } private Activity activity = null; private TextView titleTxtv = null; } |
在WkjTest工程中,選中MainActivityTest類,點右鍵,選擇Run As....然后選Android JUnit Test,在隨后彈出的界面選擇測試設備,運行程序后,在Junit視圖會顯示,執行了test001測試用例,并且該測試用例失敗了,這正是我們目前所需要的結果。
另外,注意我們對測試用例的命名,testTemp001,表明是臨時性的測試用例。采用這種方式命名的測試用例,表明是在開發過程中使用的臨時測試用例,不是用于回歸測試中的正式測試用例。
下面開始編寫功能性代碼,來使這個測試用例通過。
還記得在本文開頭處提到的MVC架構嗎?現在我們就開始來一步步實現這個MVC架構。我們將Activity當作視圖View,View讀取Model中數據并顯示到界面上,testTemp001這是為了測試這一工作模式。
在Android中怎樣來實現一個Model呢?實現Model當然有很多種方式,我在這里采用擴展Application類來當作Model,即定義AppModel并繼承Application,這樣做的好處是Model不用采用Singleton模式也可以實現單例模式了,而且可以很方便在Activity中獲取到。在我們這個最簡單的應用中,需要Model中存在welcom_msg信息,這時在MainActivity中才可以通過向Model請求數據并顯示在界面中。
AppModel類如下所示:
package com.bjcic.wkj; import android.app.Application; public class AppModel extends Application { // 生命周期方法開始 public void onCreate() { super.onCreate(); welcomeMsg = getString(R.string.welcome_msg); } public void onTerminate() { super.onTerminate(); } // 生命周期方法結束 private String welcomeMsg = null; public String getWelcomeMsg() { return welcomeMsg; } public void setWelcomeMsg(String welcomeMsg) { this.welcomeMsg = welcomeMsg; } } 在MainActivity中添加如下代碼: [java] view plaincopy @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); appModel = (AppModel)getApplication(); } @Override public void onResume() { super.onResume(); ((TextView)findViewById(R.id.j_titleTxtv)).setText(appModel.getWelcomeMsg()); } private AppModel appModel = null; |
最后在Manifest文件中添加:
<application android:allowBackup="true" android:name=".AppModel" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > |
這時再回到WkjTest工程,選中MainActivityTest類,右鍵選擇Run As .... =>Android JUnit Test,這時Junit視圖將顯示測試用例通過。就這樣,我們的第一個測試驅動開發周期就結束了。
相關文章:
posted on 2013-12-19 11:05 順其自然EVO 閱讀(292) 評論(0) 編輯 收藏 所屬分類: android