單元測試第二彈——單元測試與單元測試框架

單元測試第二彈——單元測試與單元測試框架

抱歉,最近實在他忙了,剛剛更新了兩篇。後面我會盡快寫完這個系列。謝謝支持。算法

黑盒測試與白盒測試

在第一彈中咱們介紹過,軟件的測試包含單元測試、集成測試、系統測試和迴歸測試四個階段。那麼,這裏咱們先來看下各個階段都使用怎樣的測試方法。編程

軟件測試,從測試方法上來區分能夠分爲黑盒測試、白盒測試和灰盒測試。markdown

黑盒測試數據結構

黑盒測試,也稱爲功能測試。測試者不瞭解程序的內部狀況,不需具有應用程序的代碼、內部結構和編程語言的專門知識。只知道程序的輸入、輸出和系統的功能,這是從用戶的角度針對軟件界面、功能及外部結構進行測試,而不考慮程序內部邏輯結構。測試案例是依應用系統應該作的功能,照規範、規格或要求等設計。測試者選擇有效輸入和無效輸入來驗證是否正確的輸出。 此測試方法可適合大部分的軟件測試,如集成測試以及系統測試。框架

黑盒測試主要是爲了發現如下幾類錯誤:編程語言

是否有不正確或遺漏的功能?ide

在接口上,輸入是否能正確的接受?可否輸出正確的結果?工具

是否有數據結構錯誤或外部信息(例如數據文件)訪問錯誤?性能

性能上是否可以知足要求?單元測試

是否有初始化或終止性錯誤?

白盒測試

白盒測試又稱透明盒測試、結構測試等。測試應用程序的內部結構或運做,而不是測試應用程序的功能(即黑盒測試)。在白盒測試時,以編程語言的角度來設計測試案例。測試者輸入數據驗證數據流在程序中的流動路徑,並肯定適當的輸出,相似測試電路中的節點。測試者瞭解待測試程序的內部結構、算法等信息,這是從程序設計者的角度對程序進行的測試。 白盒測試能夠應用於單元測試、集成測試和系統的軟件測試流程。

白盒測試主要是想對程序模塊進行以下檢查:

對程序模塊的全部獨立的執行路徑至少測試一遍。

對全部的邏輯斷定,取「真」與取「假」的兩種狀況都能至少測一遍。

在循環的邊界和運行的界限內執行循環體。

測試內部數據結構的有效性,等等。

灰盒測試

灰盒測試,是介於白盒測試與黑盒測試之間的一種測試,灰盒測試多用於集成測試階段,不只關注輸出、輸入的正確性,同時也關注程序內部的狀況。灰盒測試不像白盒那樣詳細、完整,但又比黑盒測試更關注程序的內部邏輯,經常是經過一些表徵性的現象、事件、標誌來判斷內部的運行狀態。

對代碼作白盒測試


上面介紹了軟件測試中的黑盒、白盒和灰盒測試。白盒測試被普遍的使用在單元測試階段。

這裏咱們先來分析下,咱們要進行單元測試,須要作哪些事情?由於單元測試的主要手段是白盒測試,白盒測試的測試方法是:測試者輸入數據驗證數據流在程序中的流動路徑,並肯定適當的輸出。那麼整個測試流程大概須要包含如下幾個步驟:

  • 初始化測試環境、準備測試數據。
  • 調用須要被測試的單元。
  • 收集結果,並與指望值比較。
  • 測試數據清理。
    以上四個步驟在每一個單元在被測試的時候都須要被執行。舉個例子,咱們有一個除法運算的方法,咱們要對他作單元測試。
    public class Calculator{
    public float divide(float divisor,float dividend){
        return divisor/dividend;
    }
    }

    咱們要在程序中驗證上面這個方法的正確性,通常會寫如下代碼來測試他:

public class CalculatorTest{
    public static void main(String [] args){
        Calculator calculator = new Calculator();
        float result = calculator. divide(10.0,2.0);
        if(result == 5.0){
            System.out.println("divide test ok");
        }else{
            System.out.println("divide test failed");
        }
    }
}

這只是對該方法測試的第一個測試,若是我想測試這個方法在被除數是0的狀況下會怎麼樣,那麼我就要再寫一個CalculatorTest2,而後重寫寫一個main方法,再從新定義一個Calculator對象,而後在調用divide方法的時候把第二個參數的值傳爲0。

其實上面的測試是存在很大問題的,由於在內存中並沒有法精確的存儲浮點數,當咱們把兩個浮點數相除的時候結果並不必定能夠精確的存儲下來,而咱們的逾期結果倒是一個精確值,這樣的比較可能會不相等的。可是這樣的狀況須要多個case纔有可能被發現。

因此,咱們在測試一個類中的一個方法的時候,可能要定義大量的類,而後須要分別執行,而且經過看控制檯的輸出才能確認結果。

這裏,請先記住這些問題,由於,接下來咱們要介紹的測試框架會幫咱們解決這些問題的。

單元測試框架


一般,在沒有特定框架支持下,咱們在對一個方法進行單元測試的時候,無外乎是使用分支判斷、異常處理、流程控制等來控制代碼的執行,經過程序輸出來表示方法的執行成功和失敗。這樣存在的最大問題就是咱們每執行完一個單測以後,都要去控制檯看輸出才知道單元測試有沒有成功,這明顯是不合理的,由於單元測試是須要自動化執行的,程序沒辦法幫咱們檢查輸出是否正確的。

單元測試框架就解決了這個問題,一旦使用了框架,加入單元測試相對來講會簡單許多。一般,Java中經常使用的單元測試框架通常包含三個功能:測試工具、測試套件、測試運行器。

  • 測試工具

  • 測試工具是一整套固定的工具用於基線測試。測試工具的目的是爲了確保測試可以在共享且固定的環境中運行,所以保證測試結果的可重複性。通常負責初始化測試環境、準備測試數據和測試數據清理。
  • 測試套件

  • 測試套件意味捆綁幾個測試案例而且同時運行。
  • 測試運行器

  • 用於執行測試案例。通常負責調用須要被測試的單元、收集結果、並與指望值比較。
    除了以上這些功能以外,針對不一樣的功能,通常還會提供不少API和語法支持。

下一彈會重點介紹如何使用JUnit進行單元測試。關於JUnit的文章已經在個人博客中更新了,我會在這周內發到公衆號中。

參考資料


白盒測試

黑盒測試

【軟件測試】 黑盒測試、白盒測試、灰盒測試

相關推薦單元測試第一彈——從軟件開發生命週期談單元測試無單測、不編碼——寫單元測試的重要性

相關文章
相關標籤/搜索