qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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視圖將顯示測試用例通過。就這樣,我們的第一個測試驅動開發周期就結束了。
          相關文章:
          Android測試驅動開發實踐

          posted on 2013-12-19 11:05 順其自然EVO 閱讀(292) 評論(0)  編輯  收藏 所屬分類: android

          <2013年12月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西充县| 肃北| 法库县| 福鼎市| 石门县| 滦平县| 小金县| 天镇县| 南岸区| 昭苏县| 南靖县| 永定县| 利辛县| 成武县| 霍邱县| 黄山市| 化德县| 蒙城县| 灌云县| 尖扎县| 西畴县| 靖安县| 宁安市| 江源县| 龙门县| 朝阳县| 北流市| 新绛县| 鹰潭市| 静宁县| 昆山市| 祁阳县| 都江堰市| 惠安县| 定边县| 金秀| 库伦旗| 通榆县| 稷山县| 嫩江县| 抚顺县|