軟工第八次實驗——測試

實際上是沒有前七次實驗的
由於第八次實驗是考試,複習了前七次實驗的內容。
因此這個第八次實驗是個僞命題hiahiahiahtml

文章目錄

    • 1、軟件測試
      • 1.1 概述
      • 1.2 軟件生命週期
      • 1.2 軟件測試原則
      • 1.3 測試分類
    • 2、黑盒測試
      • 2.1 概述
      • 2.2 等價類劃分法
        • 2.2.1 概述
        • 2.2.2 等價類
        • 2.2.3 劃分原則
        • 2.2.5 劃分步驟
      • 2.3 示例
        • 2.3.1 題目要求
        • 2.3.2 等價類劃分表
        • 2.3.3 測試用例
          • 2.3.3.1 有效等價類
          • 2.3.3.2 無效等價類
    • 3、白盒測試
      • 3.1 概述
      • 3.2 邏輯覆蓋法
      • 3.3 分支覆蓋
      • 3.4 示例
        • 3.4.1 題目要求
        • 3.4.2 流程圖及分支標註
        • 3.4.3 分支覆蓋及用例列表
    • 4、實驗1:三角形類型判斷
      • 4.1 問題描述
      • 4.2 參考等價類劃分
    • 5、往屆試題
      • 5.1 11年試題:標識符判斷
        • 5.1.1 題目描述
        • 5.1.2 參考等價類劃分
        • 5.1.3 參考測試用例
      • 5.2 15年試題:標識符判斷加工
      • 5.3 12年試題:用戶名正確性測試
        • 5.3.1 題目描述
        • 5.3.2 參考等價類劃分
        • 5.3.3 參考測試用例
      • 5.4 14年試題(一):測試抄錯的代碼
        • 5.4.1 題目描述
        • 5.4.2 參考流程圖
        • 5.4.3 參考測試用例
      • 5.5 14年試題(二):電話號碼
        • 5.5.1 題目描述
        • 5.5.2 參考等價類劃分
        • 5.5.3 參考測試用例
    • 6、參考資料

1、軟件測試

1.1 概述

軟件測試是爲了發現程序中的錯誤而執行程序的過程,貫穿於軟件生命週期,其目的是儘早發現軟件缺陷,並確保其得以修復。再全面的測試也不能徹底消除軟件缺陷,但願徹底依託測試確保軟件質量是不現實的。java

1.2 軟件生命週期

從軟件工程的角度來看,軟件的生命週期通常分爲4部分:app

  • 軟件分析時期
  • 軟件設計時期
  • 編碼和測試時期
  • 軟件運行與維護時期

在編碼的同時,也進行着單元測試。函數

1.2 軟件測試原則

  • 徹底測試是不可能的。測試並不能找出全部錯誤。
  • 測試中存在風險。
  • 軟件測試只能表示缺陷的存在,而不能證實軟件產品已經沒有缺陷。
  • 軟件產品中潛在的錯誤數與已發現的錯誤數成正比。
  • 讓不一樣的測試人員參與到測試工做中。
  • 讓開發小組和測試小組分立。
  • 儘早並不斷進行測試。
  • 在設計測試用例時,應該包括輸入數據和預期的輸出結果兩部分。
  • 集中測試容易出錯或錯誤較多的模塊。
  • 長期保留全部的測試用例。

1.3 測試分類

 

2、黑盒測試

2.1 概述

將被測試的軟件系統當作一個黑盒子,不關心盒子的內部結構和內部特性,只關心軟件產品的輸入數據和輸出結果。
黑盒測試的測試方法有等價類劃分法邊界值分析法錯誤推測法因果圖法單元測試

2.2 等價類劃分法

2.2.1 概述

將程序的輸入域劃分爲若干子集,而後從每一個子集中選取少數具備表明性的數據用做測試用例。所選取的輸入數據對於揭露程序中的錯誤都是等效的。測試

2.2.2 等價類

等價類分爲有效等價類和無效等價類:ui

  • 有效等價類:對程序的規格說明是有意義的、合理的輸入數據所構成的集合。
  • 無效等價類:對程序的規格說明是無心義的、不合理的輸入數據所構成的集合

2.2.3 劃分原則

劃分等價類時遵循的原則:編碼

  1. 若是輸入條件規定了取值範圍或個數,則可肯定一個有效等價類和兩個無效等價類。例如,若是輸入值x在0到100之間,那麼有效等價類是0<=x<=100,無效等價類是x<0和x>100。
  2. 若是輸入條件規定了輸入值的集合或是規定了「必須如何」的條件,則能夠肯定一個有效等價類和一個無效等價類。例如,若是輸入值是日期類型,那麼有效等價類是日期類型的數據,無效等價類是非日期類型的數據。
  3. 若是輸入條件是布爾表達式,則能夠分爲一個有效等價類和一個無效等價類。例如,若是要求密碼非空,則有效等價類爲非空密碼,無效等價類爲空密碼。
  4. 若是輸入條件是一組值,且程序對不一樣的值有不一樣的處理方式,則每一個容許的輸入值對應一個有效等價類,全部不容許的輸入值的集合爲一個無效等價類。例如,若是級別的值是初級、中級、高級,則有效等價類應該有三個,分別爲初級、中級、高級,無效等價類有一個,爲其餘任何級別。
  5. 若是規定了輸入數據必須遵循的規則,則可劃分出一個有效等價類(符合規則)和若干個無效等價類(從不一樣的角度違反規則)

2.2.5 劃分步驟

  1. 對每一個輸入和外部條件進行等價劃分,畫出等價類表,併爲每一個等價類進行編號。
  2. 設計一個測試用例,使其儘量多地覆蓋有效等價類,重複這一步直到其有效等價類被覆蓋。
  3. 爲每個無效等價類設計一個測試用例。

2.3 示例

2.3.1 題目要求

測試一個函數dateValidation(int year, int month, int day),功能是驗證輸入日期是否合法。spa

輸入三個變量(年、月、日),函數返回布爾值,判斷該日期是否合法:1≤月份≤12,1≤日期≤31,2000≤年份≤2019。.net

2.3.2 等價類劃分表

輸入及外部條件 有效等價類 等價類編號 無效等價類 等價類編號
日期的類型 數字字符 1 非數字字符 8
year 2000<=year<=2019 2 year<2000 year>2019 9 10
month 1<=month<=12 3 month<1 month>12 11 12
非閏年的2月 1<=day<=28 4 day<1 day>28 13 14
閏年的2月 1<=day<=29 5 day<1 day>29 15 16
month ϵ {1,3,5,7,8,10,12} 1<=day<=31 6 day<1 day>31 17 18
month ϵ {4,6,9,11} 1<=day<=30 7 day<1 day>30 19 20

2.3.3 測試用例

2.3.3.1 有效等價類
序號 輸入數據 預期輸出 覆蓋範圍(等價類編號)
year month day
1 2008 1 9 TRUE 1,2,3,6
2 2008 2 29 TRUE 1,2,3,5
3 2008 4 30 TRUE 1,2,3,7
4 2018 2 28 TRUE 1,2,3,4
2.3.3.2 無效等價類
序號 輸入數據 預期輸出 覆蓋範圍(等價類編號)
year month day
1 x 2 29 FALSE 8
2 1234 3 2 FALSE 9
3 2222 3 2 FALSE 10
4 2018 0 3 FALSE 11
5 2018 13 1 FALSE 12
6 2018 2 0 FALSE 13
7 2018 2 29 FALSE 14
8 2004 2 0 FALSE 15
9 2004 2 30 FALSE 16
10 2018 3 0 FALSE 17
11 2018 3 32 FALSE 18
12 2018 4 0 FALSE 19
13 2018 4 31 FALSE 20

3、白盒測試

3.1 概述

白盒測試關注軟件產品的內部細節和邏輯結構。

方法:

  • 邏輯覆蓋測試方法
  • 基本路徑測試方法

3.2 邏輯覆蓋法

根據覆蓋的目標不一樣,可分爲語句覆蓋、分支覆蓋、條件覆蓋、分支-條件覆蓋、條件組合覆蓋、路徑覆蓋。

  1. 語句覆蓋每條語句至少執行一次。
  2. 斷定覆蓋每一個斷定的每一個分支至少執行一次。
  3. 條件覆蓋每一個斷定的每一個條件應取到各類可能的值。
  4. 斷定/條件覆蓋同時知足斷定覆蓋條件覆蓋。
  5. 條件組合覆蓋每一個斷定中各條件的每一種組合至少出現一次。
  6. 路徑覆蓋使程序中每一條可能的路徑至少執行一次。

3.3 分支覆蓋

基本思想:設計若干個測試用例,運行被測程序,使程序中的每一個分支至少被執行一次。

以考察程序if-else結構爲基礎。

對循環結構,考察循環條件可以知足和不可能知足兩種狀況。

3.4 示例

3.4.1 題目要求

判斷是否爲閏年的函數isLeapYear(int year)。

閏年的條件是:

  • 能被4整除,但不能被100整除;
  • 能被100整除,又能被400整除。

3.4.2 流程圖及分支標註

 

3.4.3 分支覆蓋及用例列表

輸入 執行路徑
2000 1,2,4,5,8,10
2004 1,2,4,7,10
2006 1,2,3,9
1900 1,2,4,5,6,9,10

4、實驗1:三角形類型判斷

4.1 問題描述

三角形的判斷:(題目連接)
定義一個函數,用於判斷三角形的三條邊可否構成三角形,若是能,則判斷是普通三角形,等腰三角形,仍是等邊三角形。(三角形的邊長爲整數)
輸入:三角形的三條邊a,b,c(1≤a,b,c≤104)
輸出:若是是普通三角形,輸出:regular triangle!
若是是等腰三角形,輸出:isosceles triangle!
若是是等邊三角形,輸出:equilateral triangle!
若是不能構成三角形,輸出:not a triangle!
實現代碼:

//Trangle.java

package testProject;

import java.util.Scanner;

public class Trangle {
    public static boolean isTrangle (int x, int y, int z) {
        if (x <= 0 || y <= 0 || z <= 0 ||x + y <= z
                || x + z <= y || y + z <= x) {
            return false;
        }
        return true;
    }

    public static boolean isIsosceles (int x, int y, int z) {
        if(x == y || y == z || z == x) {
            return true;
        }
        return false;
    }

    public static boolean isEquilateral (int x, int y, int z) {
        if(x == y && y == z && z == x) {
            return true;
        }
        return false;
    }

    public static void main (String[] args) {
        Scanner sca=new Scanner(System.in);
        int a = 0, b = 0, c = 0;
        try {
            a = sca.nextInt();
            c = sca.nextInt();
            b = sca.nextInt();
        } catch (Exception e) {
            System.out.println(e);
        }
        if (isTrangle(a, b, c)) {
            if (isEquilateral(a, b, c)) {
                System.out.println("equilateral triangle!");
            } else if (isIsosceles(a, b, c)) {
                System.out.println("isosceles triangle!");
            } else {
                System.out.println("regular triangle!");
            }
        } else {
            System.out.println("not a triangle!");
        }
    }
    public String type (int a, int b, int c) {
        if (isTrangle(a, b, c)) {
            if (isEquilateral(a, b, c)) {
                return "equilateral triangle!";
            } else if (isIsosceles(a, b, c)) {
                return "isosceles triangle!";
            } else {
                return "regular triangle!";
            }
        } else {
            return "not a triangle!";
        }
    }
}

 

編寫實現並作黑盒(等價類劃分)與白盒測試(分支覆蓋)

注意事項:

黑盒測試:

  1. 無效等價類三條邊的劃分範圍:
    [1, 10^4],而且是正整數

  2. 黑盒測試的每個無效等價類只包含一個無效條件

  3. 容易出現過於籠統的問題

4.2 參考等價類劃分

    有效等價類 等價類編號 無效等價類 等價類編號
輸入值 輸入3個整數a,b,c(1<=a,b,c<=10000) 數字字符 1 非數字字符 15
整數 2 一邊爲非整數 a爲非整數 16
b爲非整數 17
c爲非整數 18
兩邊爲非整數 a,b爲非整數 19
a,c爲非整數 20
b,c爲非整數 21
三邊爲非整數 22
3個數 3 只輸入1個數 只輸入a 23
只輸入b 24
只輸入c 25
只輸入2個數 只輸入a,b 26
只輸入a,c 27
只輸入b,c 28
輸入3個以上數 29
1<=a,b,c<=10000 4 一邊小於1或大於10000 a<1||a>10000 30
b<1||b>10000 31
c<1||c>10000 32
兩邊小於1或大於10000 (a<1||a>10000)&&(b<1||b>10000) 33
(a<1||a>10000)&&(c<1||c>10000) 34
(b<1||b>10000)&&(c<1||c>10000) 35
三邊小於1或大於10000 (a<1||a>10000)&&(b<1||b>10000)&&(c<1||c>10000) 36
輸出值 「not a triangle」 a+b<=c 5    
a+c<=b 6
b+c<=a 7
"regular triangle" a+b>c 8    
a+c>b 9
b+c>a 10
"isosceles triangle" a=b&&b!=c 11    
a=c&&c!=b 12
b=c&&c!=a 13
"equilateral triangle" a=b&&b=c 14    

5、往屆試題

5.1 11年試題:標識符判斷

5.1.1 題目描述

在某一個PASCAL語言版本中規定:「標識符由字母開頭、後跟字母或數字的任意組合構成。有效字符數爲8個,最大字符數爲80個。」而且規定:「標識符必須先說明,再使用。」「在同一說明語句中,標識符至少必須有一個。」請用等價類劃分方法設計測試用例。

分析:有效字符數爲8個,最大字符數爲80個的意思是八個之內是有效的,能夠大於80個,但那些都是無效的,就跟百度搜索前三十個字是有效的,你能夠輸進去不少,可是無效。

5.1.2 參考等價類劃分

輸入條件 有效等價類 等價類編號 無效等價類 等價類編號
標識符首字符 字母 1 非字母 6
標識符組成 字母或數字組合 2 非字母和數字組合 7
保留字 8
標識符字符數 1~8個 3 0個 9
>8個 10
>80個 11
標識符個數(同一語句中) 至少一個 4 0個 12
標識符使用 先說明後使用 5 未說明就使用 13

5.1.3 參考測試用例

測試用例序號 輸入 預期結果 覆蓋範圍
1 VAR x,y; REAL;BEGIN x:=3.14; 經過 1,2,3,4,5
2 VAR 2x; REAL; 不經過 6
3 VAR x$; REAL; 不經過 7
4 VAR GOTO; REAL; 不經過 8
5 VAR x,y,; REAL; 不經過 9
6 VAR x123456789; REAL; 不經過 10
7 VAR x123…; REAL;(多餘80個字符) 不經過 11
8 VAR ; REAL; 不經過 12
9 VAR x,y; REAL;BEGIN z:=5.20; 不經過 13

5.2 15年試題:標識符判斷加工

在某程序設計語言的語法中規定:「標識符由字母開頭、後跟字母或數字的任意組合構成。有效字符數爲8個,最大字符數爲80個。」而且規定:「標識符必須先說明,再使用。」「在同一說明語句中,標識符至少必須有一個。」
根據上述的描述,利用等價類劃分法,獲得下表(表中括號中的數字爲等價類編號)。

輸入數據 有效等價列 無效等價類
標識符個數 1個(1),多個(2) 0個(3)
標識符字符數 1-80個(4) 0個(5),大於80個(6)
標識符組成 字母(7),數字(8) 非字母數字字符(9),保留字(10)
第一個字符 字母(11) 非字母(12)
標識符使用 先說明後使用(13) 未說明已使用(14)

下面選取了八個測試用例,它們覆蓋了全部的等價類,請在下劃線中標出相應的等價類編號。

  1. VAR x, S7654321;
    BEGIN x:=6.313;S7654321:=8.953;
    (1)(2)(4)(7)(8)(11)(13)
  2. VAR:REAL;
    (3)
  3. VAR x,:REAL;
    (5)
  4. VAR S7654321…:REAL;(注:標識符字符數超過80個)
    (6)
  5. VAR S$:CHAR;
    (9)
  6. VAR GOTO:INTEGER;
    (10)
  7. VAR 5S:REAL;
    (12)
  8. VAR TAR:REAL;
    BEGIN…
    TAP:=SIN(3.14*0.8)/8
    (14)

5.3 12年試題:用戶名正確性測試

5.3.1 題目描述

登陸用戶名由英文字母和數字組成,字符長度8-12位,不能僅有字母,也不能僅有數字,也不能有其餘非英文字母。用等價類劃分法設計測試用例。

5.3.2 參考等價類劃分

輸入條件 有效等價類 編號 無效等價類 編號
用戶名長度 8~12位 1 <8位 3
>12位 4
用戶名組成 英文字母和數字組合 2 只包含字母 5
只包含數字 6
包含其餘非英文字母 7

5.3.3 參考測試用例

測試用例序號 用戶名輸入 預期結果 覆蓋類範圍
1 zhangsan3 有效 1,2
2 lisi4 無效 3
3 wangwudalang12345 無效 4
4 gebilaowang 無效 5
5 233333333 無效 6
6 &&&$$&&& 無效 7
7 zhangsan_3 無效 7

插播一條特別消息…
不要問我爲啥沒有13年的 😦 ,由於我就是沒有13的。
也沒得題,也沒得答案,本身也菜的不敢瞎寫,因此沒得2013

5.4 14年試題(一):測試抄錯的代碼

5.4.1 題目描述

同窗A寫代碼段以下:
{
int T = 0;
if(A>=1) &&(B>=2) T=T+1;
else T=T+2;
if(x>=90)&&(y>=75) T=T+3;
else T=T+4;
printf(「%d」,&T);
]
同窗B抄錯以下:
{
int T = 0;
if(A>=1) &&(B>=2) T=T+1;
else T=T+2;
if(x>=90)&&(y<75) T=T+3;
else T=T+4;
printf(「%d」,&T);
]
請用白盒測試-分值覆蓋法設計測試。寫出思路,並進行描述。

5.4.2 參考流程圖

 

5.4.3 參考測試用例

序號 輸入 覆蓋分支 A的正確輸出 B的錯誤輸出
1 A=1;B=2;x=90;y=75; 124 4 5
2 A=0;B=2;x=90;y=75; 134 5 6
3 A=1;B=2;x=90;y=74; 125 5 4
4 A=0;B=2;x=90;y=74; 135 6 5

經過測試,B同窗對於測試用例1獲得結果T=5,測試用例2獲得結果T=6,測試用例3獲得結果4,測試用例4獲得結果5明顯錯誤,能夠測試出問題。

5.5 14年試題(二):電話號碼

5.5.1 題目描述

一個地區的電話號碼由地區碼,前綴,後綴三部分組成。地區碼能夠是空白,也能夠是三個數字。前綴由首位大於等於5的四位數字組成。後綴由四位數字組成。請用等價類劃分法設計測試。寫出思路,並進行描述。

5.5.2 參考等價類劃分

輸入條件 有效等價類 等價類編號 無效等價類 等價類編號
地區碼 空白 1 包含非數字字符 5
長度<3 6
三位數字 2
長度>3 7
前綴 5000~9999 3 包含非數字字符 8
首位<5 9
長度<4 10
長度>4 11
後綴 四位數字 4 包含非數字字符 12
長度<4 13
長度>4 14

5.5.3 參考測試用例

測試用例序號 輸入 預期結果 覆蓋範圍
區域碼 前綴 後綴
1 空白 5000 1234 有效 1,3,4
2 123 5000 1234 有效 2,3,4
3 A12 5000 1234 無效 5
4 12 5000 1234 無效 6
5 1234 5000 1234 無效 7
6 123 500A 1234 無效 8
7 123 4000 1234 無效 9
8 123 500 1234 無效 10
9 123 50000 1234 無效 11
10 123 5000 A123 無效 12
11 123 5000 123 無效 13
12 123 5000 1234 無效 14

6、參考資料

[1]軟工第五次上機PPT
[2]https://www.cnblogs.com/AlvinZH/p/7055708.html


  1. 軟工第五次上機PPT ↩︎

  2. https://www.cnblogs.com/AlvinZH/p/7055708.html ↩︎

相關文章
相關標籤/搜索