qileilove

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

          Android測試驅動開發實踐

           在Android應用開發中,相信很少有人在堅持先由設計人員做完整的概要設計 、詳細設計,然后交給程序員進行編碼實現了。通常是在有一個大體框架的情況下,就開始進行具體編碼開發了。在這種情形下,開發速度可以有很大的提高,但是最終代碼質量卻不可避免的降低了。如何能既保持開發速度,同時又能保證開發質量呢?相信測試驅動開發是一種比較可行的開發方法學。
            測試驅動開發首先通過設計測試用例,對從用戶需求到方法接口進行細化,在構想這些測試用例的過程,就是站在使用者角度上來思考系統的過程,而傳統方法中設計人員通常是站在技術人員的角度來思考問題,兩者比較,顯然測試驅動開發更有助于開發出更符合用戶需求的產品,同時開發出高復用性代碼。
            測試驅動開發先寫測試,這樣就保證了充分考慮到了方法使用者需要,可以使方法更加合理。接下來進行代碼開發,以盡可能短的時間通過測試用例,在這個過程中暫時忘掉OO和設計模式吧。當通過測試用例之后,我們再回過頭來審視我們的代碼實現,再去除類間依賴關系,使用恰當的設計模式,這比在開始階段憑空想象要好得多。反復上述過程,自然可以得到質量更高的代碼和系統。
            然而,在Android系統下,進行測試驅動開發又增加了額外的難度,怎樣對Activity、Provider、Service、Broadcaster等進行單元測試,是一個必須要解決的問題,下面我們就以一個實際系統的開發,來看一看怎么解決這一系列的問題。
            進行測試驅動開發,首先要做的就是建立一個真正可運行的骨架系統,做Android下的測試驅動開發也不例外。
            先建立一個Android工程,這里以mhcs為例,采用Eclipse向導,建立該工程。假設這個工程在用戶第一次使用時,需要顯示三個介紹頁面,用戶在一張一張劃過之后,才開始使用正常功能。接下來我們就以這個功能為例,詳細描述一下在Android下怎樣進行測試驅動開發。
            首先,準備三張介紹圖片,放入res/drawable目錄下。我們定義FlipIntroActivity類來處理用戶的劃動操作及介紹圖片顯示。由于我們要在用戶第一次運行時才向用戶顯示介紹頁面,因些需要保存用戶是否第一次使用系統的信息。我們利用Application的子類AppPreferences來管理應用所需的所有信息。
            這時我們需要完成的功能就很清楚了,程序在第一次運行時顯示介紹頁面,而之后的運行中,不顯示介紹頁面。是否顯示介紹頁面,由AppPreferences類來管理。
            下面在Eclipse里建立測試工程,選擇新工程類型為Android Junit Test工程,同時選擇上面建立的工程作為被測試工程。
            好了,最小可運行骨架系統已經建立好了,下面就可以進入正式的測試驅動開發流程了。
            首先寫測試用例:新建類AppPreferencesTest,由于被測試類AppPreferences是Application的子類,因此AppPreferencesTest類需要繼承ApplicationTestCase
          public class AppPreferencesTest extends ApplicationTestCase<AppPreferences> {
          public AppPreferencesTest(Class<AppPreferences> applicationClass) {
          super(applicationClass);
          }
          }
            我們首先測試AppPreferences在第一次運行時,可以返回true,在AppPreferencesTest類里添加如下測試代碼:
          public void testFirstRunTrue() {
          assertTrue(prefs.isFirstRun());
          }
          private AppPreferences prefs = new AppPreferences();
            這如你所看到的,這段代碼編譯器立即使出錯誤,不要擔心,測試驅動開發總是從不能通過的測試用例開始的,每次努力通過一個測試用例,在通過一個個測試用例的過程中取得進展。
            下面我們首先編寫代碼,通過這個測試用例,我們在AppPreferences類中添加如下代碼:
          public boolean isFirstRun() {
          return isFirstRun;
          }
          public void setFirstRun(boolean isFirstRun) {
          this.isFirstRun = isFirstRun;
          }
          private boolean isFirstRun = true;
            但是,如果是第二次運行,系統不是還會顯示true嗎?這明顯是不正確的!一點兒沒錯,這段代碼確實沒有實現我們之前的想法,但是這段代碼卻可以通過我們的測試用例,測試驅動開發的原則就是以盡量快的速度通過測試用例。


          好了,在測試工程中選擇AppPreferencesTest,然后選擇Android Junit Test,系統運行,你會在Junit視圖中看到綠色用例通過標記。
            下面添加一段代碼,測試當第二次運行時的情況:
          public void testSecondAndMoreRun() {
          prefs.isFirstRun();
          assertFalse(prefs.isFirstRun());
          }
            運行上述工程,結果測試用例testSecondAndMoreRun不能通過,下面我們就來處理這種情況,在生產工程中的AppPreferences類中添加如下代碼:
          public boolean isFirstRun() {
          boolean orgVal = isFirstRun;
          isFirstRun = false;
          return orgVal;
          }
            這時再來運行測試工程的AppPreferencesTest類,又可以看到令我們心曠神怡的綠色通過標志了。
            下面就剩下第一次運行可以通過,第二次運行不能通過。具體代碼如下所示:
            在生產項目的類AppPreferences中添加:
          @Override
          public void onCreate() {
          super.onCreate();
          }
          public void onTerminate() {
          super.onTerminate();
          }
          public boolean isFirstRun() {
          prefs = getSharedPreferences("mhcs", MODE_PRIVATE);
          boolean orgVal = isFirstRun;
          isFirstRun = false;
          Editor editor = prefs.edit();
          editor.putBoolean(PREF_IS_FIRST_RUN, false);
          editor.commit();
          return orgVal;
          }
          public void setFirstRun(boolean isFirstRun) {
          this.isFirstRun = isFirstRun;
          }
          public final static String PREF_IS_FIRST_RUN = "isFirstRun";
          private SharedPreferences prefs = null;
          private boolean isFirstRun = true;
            在測試項目的測試類中添加代碼:
          public void testFirstRunTrue() {
          createApplication();
          prefs = getApplication();
          Editor editor = mContext.getSharedPreferences("mhcs", 0).edit();
          editor.clear().commit();
          assertTrue(prefs.isFirstRun());
          }
          public void testSecondAndMoreRun() {
          createApplication();
          prefs = getApplication();
          assertFalse(prefs.isFirstRun());
          }
            尤其需要注意的是testFirstRunTrue方法中,先將SharedPreferences清空的處理,這樣可以模擬程序安裝后第一次運行。
            運行測試項目的測試用例,終于可以看到完整功能的綠色通過標志了。

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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桓台县| 宜兰县| 青岛市| 综艺| 龙胜| 都昌县| 常熟市| 思茅市| 内丘县| 上犹县| 蕉岭县| 娄底市| 兴安县| 宁阳县| 颍上县| 正蓝旗| 依安县| 廊坊市| 宜兰市| 高清| 南岸区| 乐清市| 巴林右旗| 武定县| 醴陵市| 凉山| 彭州市| 汾西县| 仁寿县| 塘沽区| 灌阳县| 丰镇市| 宁阳县| 华蓥市| 安平县| 封丘县| 彝良县| 镇康县| 格尔木市| 阿拉尔市| 抚宁县|