軟體測試作為程式員必備的一項技能是決定軟體開發周期長短以及軟體運行成敗的關鍵,可以說好的軟體不是代碼寫得好而是有效的測試決定的。本文將介紹在android下利用eclipse進行開發時如何使用JUnit進行單元測試。 一、測試的分類(僅舉例其中一些方法) 【根據測試是否知道代碼】 1、黑盒測試(測試 ...
軟體測試作為程式員必備的一項技能是決定軟體開發周期長短以及軟體運行成敗的關鍵,可以說好的軟體不是代碼寫得好而是有效的測試決定的。本文將介紹在android下利用eclipse進行開發時如何使用JUnit進行單元測試。
一、測試的分類(僅舉例其中一些方法)
【根據測試是否知道代碼】
1、黑盒測試(測試的時候不知道具體代碼):指的是把被測的軟體看作是一個黑盒子,我們不去關心盒子裡面的結構是什麼樣子的,只關心軟體的輸入數據和輸出結果。它只檢查程式功能是否按照需求規格說明書的規定正常使用,程式是否能適當地接收輸入數據而產生正確的輸出信息。黑盒測試著眼於程式外部結構,不考慮內部邏輯結構,主要針對軟體界面和軟體功能進行測試。
2、白盒測試(測試的時候需要瞭解具體的代碼):指的是把盒子蓋子打開,去研究裡面的源代碼和程式結果。是按照程式內部的結構測試程式,通過測試來檢測產品內部動作是否按照設計規格說明書的規定正常進行,檢驗程式中的每條通路是否都能按預定要求正確工作。
3、灰盒測試(灰盒測試介於黑盒測試與白盒測試之間):可以這樣理解,灰盒測試關註輸出對於輸入的正確性,同時也關註內部表現,但這種關註不象白盒那樣詳細、完整,只是通過一些表徵性的現象、事件、標誌來判斷內部的運行狀態,有時候輸出是正確的,但內部其實已經錯誤了,這種情況非常多,如果每次都通過白盒測試來操作,效率會很低,因此需要採取這樣的一種灰盒的方法。
【根據測試的粒度】
1、方法測試(function test):驗證模塊的功能。
2、單元測試(unit test):在最低的功能/參數上驗證程式的準確性,比如測試一個函數的正確性。
3、集成測試(intergration test):驗證幾個互相有依賴關係的模塊的功能。
【根據測試的次數】
1、冒煙測試(smoke test):指的是測試人員在同一時間對軟體進行大量的點擊或者功能測試,測試軟體遭到這樣的壓力時是否能夠扛得住,關鍵在於同一個用戶在極短的時間內對軟體進行大量重覆的測試。
2、壓力測試(pressure test):指的是軟體或者網站在同一時間內被大量的用戶訪問,突出的是軟體或者網站被大量客戶訪問時的抗壓能力,一般運用於大型網站的測試。
二、舉例對其中的JUnit測試進行講解
這裡我們想要對安卓應用程式中AppService類中的randomArray()方法進行單元測試。
註:試直接使用java的JUnit是無效的,應為java應用程式時在java虛擬機(JVM)運行的,而安卓程式則是在終端的Dalvik虛擬機運行的,所以直接對其進行JUnit測試會報錯,故我們可以使用以下方法進行測試。
1、創建一個包,併在包下新建一個測試類(TestService)用來測試該方法,具體代碼如下:
AppService 的randomArray方法:
1 package com.app.wolf; 2 3 public class AppService { 4 /** 5 * 隨機指定範圍內N個不重覆的數 在初始化的無重覆待選數組中隨機產生一個數放入結果中, 6 * 將待選數組被隨機到的數,用待選數組(len-1)下標對應的數替換 然後從len-2里隨機產生下一個隨機數,如此類推 7 * 8 * @param max 9 * 指定範圍最大值 10 * @param min 11 * 指定範圍最小值 12 * @param n 13 * 隨機數個數 14 * @return int[] 隨機數結果集 15 */ 16 public static int[] randomArray(int min, int max, int n) { 17 int len = max - min + 1; 18 19 if (max < min || n > len) { 20 return null; 21 } 22 23 // 初始化給定範圍的待選數組 24 int[] source = new int[len]; 25 for (int i = min; i < min + len; i++) { 26 source[i - min] = i; 27 } 28 29 int[] result = new int[n]; 30 Random rd = new Random(); 31 int index = 0; 32 //這個演算法666,我理解的步驟應該是這樣的 33 //1、首先初始化一個數組source,這個數組的長度是用戶選擇要開始游戲的人數,接著將數組中的元素分別是0~數組長度-1; 34 //2、接著借用一個一個隨機變數index,這個變數產生的隨機數範圍是0~數組長度-1; 35 //3、最後將每一個index對應的source的內容對應到最後返回的result數組中; 36 //最厲害的地方就是首先用index索引取得source數組中的內容,此時數組的長度減1,接著用數組的最後一個元素來代替之, 37 //這樣就不會出現數組中元素被重覆使用的情況了。 38 for (int i = 0; i < result.length; i++) { 39 // 待選數組0到(len-2)隨機一個下標 40 index = Math.abs(rd.nextInt() % len--); 41 // 將隨機到的數放入結果集 42 result[i] = source[index]; 43 // 將待選數組中被隨機到的數,用待選數組(len-1)下標對應的數替換 44 source[index] = source[len]; 45 } 46 for(int i:result){ 47 System.out.print(i+"\t"); 48 } 49 return result; 50 } 51 52 }
TestService類:
1 package com.app.wolf.testService; 2 3 import com.app.wolf.AppService; 4 5 import android.R.integer; 6 import android.test.AndroidTestCase; 7 8 public class TestService extends AndroidTestCase { 9 10 /** 11 * 用JUnit測試randomArray方法 12 * @throws Exception 13 */ 14 public void testRandomArray() throws Exception { 15 AppService service=new AppService(); 16 int[] resultArray=service.randomArray(2, 7, 6); 17 for(int result:resultArray){ 18 System.out.print(result+"\t"); 19 } 20 } 21 22 }
2、如果直接在outline中對 testRandomArray()方法右擊進行Android JUnit Test ,則會曝出以下異常:
“WolfApp does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml”
這是因為在AndroidManifest.xml中沒有對 InstrumentationTestRunner 以及 uses-library 進行配置。
3、對於上面的錯誤,我們可以在AndroidManifest.xml文件加上以下的代碼進行配置:
<!-- 使用該行語句對instrumentation進行配置,但是值得註意的是targetPackage應該選擇你想要測試的方法所在的包 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.app.wolf" > </instrumentation> <!-- 使用改行代碼可以對uses-library進行配置,但是必須放在application節點下 --> <uses-library android:name="android.test.runner" />
4、對AndroidManifest.xml進行配置好了之後就回到第2步對該方法進行Android JUnit Test就能夠成功執行了。
三、總結
在測試的過程中應該適當地使用斷言assert對程式進行測試,這對於檢驗程式的運行以及檢查出錯地方具有很有效的用處,但是本測試實驗由於輸出的為數組,要判斷的話應該檢查數組中的元素是否為要求的元素,這樣檢驗起來會比較麻煩,所以筆者選擇了列印輸出的方式進行檢驗。
2016-04-04
BOB