安卓下如何使用JUnit進行軟體測試

来源:http://www.cnblogs.com/ghylzwsb/archive/2016/04/04/5353273.html
-Advertisement-
Play Games

軟體測試作為程式員必備的一項技能是決定軟體開發周期長短以及軟體運行成敗的關鍵,可以說好的軟體不是代碼寫得好而是有效的測試決定的。本文將介紹在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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 圖像映射 圖像映射也稱為圖像熱點。 作用: 讓同一張圖片上的不同區域,可以實現多個不同的超鏈接功能。 圖示: 圖像映射三步走: 圖像映射的實現需要三方面配合完成: 1、圖像映射容器,就是一個img標簽,需使用usemap屬性與map標簽建立聯繫 2、圖像映射,就是一個map標簽,需要使用name屬性... ...
  • 當IE8發佈時,它將支持很多新的CSS display屬性值,包括與表格相關的屬性值:table、table-row和table-cell,它也是最後一款支持這些屬性值的主流瀏覽器。它標志著複雜CSS佈局技術的結束,同時也給了HTML表格佈局致命一擊。最終,使用CSS佈局來製作出類似於table佈局 ...
  • IP:是網路中唯一標識一臺電腦的邏輯標識。 特例:127.0.0.1 localhost 例子:192.168.33.xxx (對應門牌號碼,身份證號碼) 點分十進位形式,分成四段 範圍:0~255.0~255. 0~255. 0~255 DN:Domain Name 功能變數名稱 例子:www.baidu... ...
  • 瀏覽器相容性常見 瀏覽器相容問題⼀:不同瀏覽器的標簽預設的外補丁和內補丁不同 問題癥狀:隨便寫⼏個標簽,不加樣式控制的情況下,各⾃的margin 和padding差異較⼤。 碰到頻率:100% 解決⽅案:CSS⾥ *{margin:0;padding:0;} 備註:這個是最常 的也是最易解決的⼀個瀏 ...
  • 之前在公司做項目的時候,有這麼一個需求,要我寫一個評論框,可以隨著評論的行數增加而自動擴大,最開始我想用textarea實現,但是後來嘗試後發現textarea並不適合,textarea的高度不會隨著輸入行數的增多而增大,於是我上網尋求了下幫助,發現大神張鑫旭的這篇文章《div模擬textarea文 ...
  • 如果你把這些當做文章來看,那你始終是學不會,而是應該當做手冊來看,這些也是自己在寫網站遇到的問題。轉載請出處。 追夢子前端博客。 1. logo添加內容給h1設置text-index:-9999px的時候會把裡面的其他標簽也給定位過去。 解決方法:如果要添加內容,那麼圖片用背景來做。 2. butt ...
  • js面向對象的組成是 1、屬性 2、方法 使用的時候是再構造函數裡面加屬性,在原型裡面加方法。 如果直接在構造函數裡面:傳值、新建對象、增加屬性/方法、返回對象的這種方法,會產生問題,主要是 1、沒有new 2、函數重覆定義,這樣會讓資源浪費 所以,我們要在構造函數裡面使用this構造屬性,把方法放 ...
  • jquery現在的事件API:on,off,trigger支持帶命名空間的事件,當事件有了命名空間,就可以有效地管理同一事件的不同監聽器,在定義組件的時候,能夠避免同一元素應用到不同組件時,同一事件類型之間的影響,還能控制一些意外的事件冒泡。在實際工作中,相信大家都用的很多,但是不一定瞭解它的所有細 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...