1. 程式人生 > >Android之編寫測試用例

Android之編寫測試用例

https://www.cnblogs.com/guop/p/5066400.html

測試是軟體工程中一個非常重要的環節,而測試用例又可以顯著地提高測試的效率和準確性。測試用例其實就是一段普通的程式程式碼,通常是帶有期望的執行結果的,測試者可以根據最終的執行結果來判斷程式是否能正常工作。

  我相信大多數的程式設計師都是不喜歡編寫測試用例的,因為這是一件很繁瑣的事情。明明執行一下程式,觀察執行結果就能知道對與錯了,為什麼還要通過程式碼來進行判斷呢?確實,如果只是普通的一個小程式,編寫測試用例是有些多此一舉,但是當你正在維護一個非常龐大的工程時,你就會發現編寫測試用例是非常有必要的。

  舉個例子吧,比如你確實正在維護一個很龐大的工程,裡面有許許多多數也數不清的功能。某天,你的領導要求你對其中一個功能進行修改,難度也不高,你很快就解決了,並且測試通過。但是幾天之後,突然有人發現其他功能出現了問題,最終定位出來的原因竟然就是你之前修改的那個功能所導致的!這下你可冤死了。不過千萬別以為這是天方夜譚,在大型的專案中,這種情況還是很常見的。由於專案裡的很多程式碼都是公用的,你為了完成一個功能而去修改某行程式碼,完全有可能因此而導致另一個功能無法正常工作。

  所以,當專案比較龐大的時候,一般都應該去編寫測試用例的。如果我們給專案的每一項功能都編寫了測試用例,每當修改或新增任何功能之後,就將所有的測試用例都跑一遍,只要有任何測試用例沒有通過,就說明修改或新增的這個功能影響到現有功能了,這樣就可以及早地發現問題,避免事故的出現。

 

1、建立測試工程

  介紹了這麼多,也是時候該動手嘗試一下了,下面我們就來建立一個測試工程。在建立之前你需要知道,測試工程通常都不是獨立存在的,而是依賴於某個現有工程的,一般比較常見的做法是在現有工程下新建一個tests資料夾,測試工程就存放在這裡。

  那麼我們就給剛建立的專案test建立一個測試工程吧。在Eclipse的導航欄中點選File→New→Other,會開啟一個對話方塊,展開Android目錄,在裡面選中Android Test Project,如圖1所示。

點選Next後會彈出建立Android測試工程的對話方塊,在這裡我們可以輸入測試工程的名字,並選擇測試工程的路徑。按照慣例,我們將路徑選擇為test專案的tests資料夾下,如圖2所示。

繼續點選Next,這時會讓我們選擇為哪一個專案建立測試功能,這裡當然選擇test了,如下圖所示。

現在點選Finish就可以完成測試工程的建立了。觀察測試工程中AndroidManifest.xml檔案的程式碼,如下所示:

複製程式碼

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.test" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

複製程式碼

其中<instrumentation>和<uses-library>標籤是自動生成的,表示這是一個測試工程,在<instrumentation>標籤中還通過android:targetPackage屬性指定了測試目標的包名。

 

2、進行單元測試

 

  建立好了測試工程,下面我們來對BroadcastBestPractice這個專案進行單元測試。單元測試是指對軟體中最小的功能模組進行測試,如果軟體中的每一個單元都能通過測試,說明程式碼的健壯性就已經非常好了。

 

test專案中有一個ActivityCollector類,主要是用於對所有的Activity進行管理的,那麼我們就來測試這個類吧。首先在testTest專案中新建一個ActivityCollectorTest類,並讓它繼承自AndroidTestCase,然後重寫setUp()和tearDown()方法,如下所示。

複製程式碼

public class ActivityCollectorTest extends AndroidTestCase {
    
    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }
    
    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }
    
}

複製程式碼

  其中setUp()方法會在所有的測試用例執行之前呼叫,可以在這裡進行一些初始化操作。tearDown()方法會在所有的測試用例執行之後呼叫,可以在這裡進行一些資源釋放的操作。

那麼該如何編寫測試用例呢?其實也很簡單,只需要定義一個以test開頭的方法,測試框架就會自動呼叫這個方法了。然後我們在方法中可以通過斷言(assert)的形式來期望一個執行結果,再和實際的執行結果進行對比,這樣一條測試用例就完成了。測試用例覆蓋的功能越廣泛,程式出現bug的概率就會越小。

  比如說ActivityCollector中的addActivity()方法是用於向集合裡新增活動的,那麼我們就可以給這個方法編寫一些測試用例,程式碼如下所示:

複製程式碼

public class ActivityCollectorTest extends AndroidTestCase {

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    public void testAddActivity()
    {
        assertEquals(0, ActivityCollector.activities.size());
        MainActivity main = new MainActivity();
        ActivityCollector.addActivity(main);
        assertEquals(1, ActivityCollector.activities.size());
    }
    
    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

}

複製程式碼

  可以看到,這裡我們添加了一個testAddActivity()方法,在這個方法的一開始就呼叫了assertEquals()方法來進行斷言,認為目前ActivityCollector中的活動個數是0。接下來new出了一個LoginActivity的例項,並呼叫addActivity()方法將這個活動新增到ActivityCollector中,然後再次呼叫assertEquals()方法進行斷言,認為目前ActivityCollector中的活動個數是1。

現在可以右擊測試工程→Run As→Android JUnit Test來執行這個測試用例,結果如圖