【軟件構造】第七章第五節 測試與測試優先編程

第七章第五節 測試與測試優先編程

  • 確保程序正確性/健壯性的最廣泛的手段:測試
    • 設計測試用例
    • 用JUnit寫測試程序
    • 自動化測試過程

Outline

  • 測試和測試優先編程
  • 黑盒測試
    • 等價類劃分
    • 邊界值分析
  • 代碼覆蓋度
  • 用註釋形式撰寫測試策略
  • JUnit測試用例寫法

 Notes

## 測試和測試優先編程

【測試的定義】html

  • 測試:發現程序中的錯誤 提升程序正確性的信心
  • 程序正確確認的基本方法:
    • 形式化推理
    • 代碼評審
    • 測試
  • 測試是提升軟件質量的重要手段
    • 確認是否可達到可用的級別
    • 關注系統某一側面的質量特性
    • 是否知足需求
    • 是否正確響應全部需求
    • 性能是否可接受
    • 是否可用
    • 能否正確部署安裝
    • 是否達到指望

 【測試的分類】express

  • 單元測試
  • 集成測試
  • 系統測試
  • 迴歸測試
  • 驗收測試

## 黑盒測試

  • 白盒測試:對程序內部代碼結構的測試 只關注代碼內部的問題
  • 黑盒測試:對程序外部表現出來的行爲的測試 採用兩個方法
    • 等價劃分  將程序可能的輸入進行分類 劃分爲不一樣集合 包括不合法數據
      • 等價類劃分可有兩種不一樣的狀況:有效等價類和無效等價類。
      • 若一組對象自反、對稱、傳遞,則爲等價類
      • 可產生類似結果的輸入集合中的一個可代替整個集合
      • 同理,對輸出也能夠劃分等價類
      • 極端:每一個分區只有一個測試用例,覆蓋全部分區
    • 邊界值分析方法   邊界值分析法是對輸入輸出的邊界值進行測試一種黑盒測試方法,是對等價類分析法的補充。
      • 錯誤一般隱藏在邊界中,如一位偏移、邊界值需單獨處理等
      • 找到有效數據和無效數據的分界點(最大值、最小值),對該分界點以及兩邊的值分別單獨進行測試。
      • 等價類劃分法能夠挑選等價類範圍內任意一個數據做爲表明,而邊界值分析法要求每一個邊界值都要做爲測試條件。
  • 測試困難
    • 軟件行爲在離散輸入空間中差別巨大 
      • 大多數正確 少數錯誤
      • bug出現不遵循特定機率分佈
    • 無統計規律可循

## 代碼覆蓋度

  • 定義:已有的測試用例有多大程度覆蓋了被測程序;
  • 代碼覆蓋度越低,測試越不充分;但要作到很高的代碼覆蓋度,須要更多的測試用例,測試代價高;
  • 代碼覆蓋率高的程序在測試期間執行了更多的源代碼,與低代碼覆蓋率的程序相比,包含未檢測到的軟件錯誤的可能性較低
  • 基本覆蓋標準:函數覆蓋;語句覆蓋、分支覆蓋、
  • 條件覆蓋、
  • 路徑覆蓋
  • 測試效果:路徑 > 分支 > 語句
  • 測試難度:路徑 > 分支 > 語句

部分轉自  長安蒹葭的博客編程

##  以註釋的形式撰寫測試策略

  • 「測試策略」通俗來說就是6個字:「測什麼」和「怎麼測」。測試策略很是重要,須要在程序中顯性記錄下來。
  • 目的:在代碼評審過程當中,其餘人可以理解你的測試,並評判測試是否充分
  • 在測試類的頂端寫策略

   

  • 在每一個測試方法前說明測試用例是如何選擇的

   

## JUnit 測試用例寫法

  • Junit單元測試是依據 註釋中@Test 以前的方法編寫的
  • JUnit測試常常調用屢次方法,使用 assertEqual || assertTrue || assertFalse 來檢查結果
  • @Before:準備測試、完成初始化,每一個測試方法前執行一次
  • @After:清理現場,每一個測試方法後執行一次
  • @Test:代表測試方法,內含Assert語句
    • 第一個參數是預期結果、第二個參數實施及結果;
    • 若是斷言失敗,該測試方法直接返回,Junit記錄該測試的失敗;
    • 一個測試方法失敗,其餘測試方法仍運行
    • @Test(expected = *.class):對錯誤的測試,expected的屬性值是一個異常
    • @Test(timeout = xxx):測試方法在制定的時間以內沒有運行完則失敗
  • @ignore:忽略測試方法
  • 栗子:
 1 public class Calculator {
 2     public int evaluate(String expression) {
 3         int sum = 0;
 4         for (String summand: expression.split("\\+"))
 5             sum += Integer.valueOf(summand);
 6         return sum;
 7     }
 8 }
 9 ---------------------------------------
10 import static org.junit.Assert.assertEquals;
11 import org.junit.Test;
12 
13 public class CalculatorTest {
14 @Test
15 public void evaluatesExpression() {
16         Calculator calculator = new Calculator();
17         int sum = calculator.evaluate("1+2+3");
18         assertEquals(6, sum); 19     }
20 }    

  

相關文章
相關標籤/搜索