Android測試驅動開發實踐

來源:互聯網
上載者:User

在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中添加:

@Overridepublic 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清空的處理,這樣可以類比程式安裝後第一次運行。

運行測試專案的測試案例,終於可以看到完整功能的綠色通過標誌了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.