實際上是沒有前七次實驗的
由於第八次實驗是考試,複習了前七次實驗的內容。
因此這個第八次實驗是個僞命題hiahiahiahtml
軟件測試是爲了發現程序中的錯誤而執行程序的過程,貫穿於軟件生命週期,其目的是儘早發現軟件缺陷,並確保其得以修復。再全面的測試也不能徹底消除軟件缺陷,但願徹底依託測試確保軟件質量是不現實的。java
從軟件工程的角度來看,軟件的生命週期通常分爲4部分:app
在編碼的同時,也進行着單元測試。函數
將被測試的軟件系統當作一個黑盒子,不關心盒子的內部結構和內部特性,只關心軟件產品的輸入數據和輸出結果。
黑盒測試的測試方法有等價類劃分法、邊界值分析法、錯誤推測法和因果圖法。單元測試
將程序的輸入域劃分爲若干子集,而後從每一個子集中選取少數具備表明性的數據用做測試用例。所選取的輸入數據對於揭露程序中的錯誤都是等效的。測試
等價類分爲有效等價類和無效等價類:ui
劃分等價類時遵循的原則:編碼
測試一個函數dateValidation(int year, int month, int day),功能是驗證輸入日期是否合法。spa
輸入三個變量(年、月、日),函數返回布爾值,判斷該日期是否合法:1≤月份≤12,1≤日期≤31,2000≤年份≤2019。.net
輸入及外部條件 | 有效等價類 | 等價類編號 | 無效等價類 | 等價類編號 |
日期的類型 | 數字字符 | 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 |
序號 | 輸入數據 | 預期輸出 | 覆蓋範圍(等價類編號) | ||
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 |
序號 | 輸入數據 | 預期輸出 | 覆蓋範圍(等價類編號) | ||
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 |
白盒測試關注軟件產品的內部細節和邏輯結構。
方法:
根據覆蓋的目標不一樣,可分爲語句覆蓋、分支覆蓋、條件覆蓋、分支-條件覆蓋、條件組合覆蓋、路徑覆蓋。
基本思想:設計若干個測試用例,運行被測程序,使程序中的每一個分支至少被執行一次。
以考察程序if-else結構爲基礎。
對循環結構,考察循環條件可以知足和不可能知足兩種狀況。
判斷是否爲閏年的函數isLeapYear(int year)。
閏年的條件是:
輸入 | 執行路徑 |
---|---|
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 |
三角形的判斷:(題目連接)
定義一個函數,用於判斷三角形的三條邊可否構成三角形,若是能,則判斷是普通三角形,等腰三角形,仍是等邊三角形。(三角形的邊長爲整數)
輸入:三角形的三條邊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, 10^4],而且是正整數黑盒測試的每個無效等價類只包含一個無效條件
容易出現過於籠統的問題
有效等價類 | 等價類編號 | 無效等價類 | 等價類編號 | |||
輸入值 | 輸入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 |
在某一個PASCAL語言版本中規定:「標識符由字母開頭、後跟字母或數字的任意組合構成。有效字符數爲8個,最大字符數爲80個。」而且規定:「標識符必須先說明,再使用。」「在同一說明語句中,標識符至少必須有一個。」請用等價類劃分方法設計測試用例。
分析:有效字符數爲8個,最大字符數爲80個的意思是八個之內是有效的,能夠大於80個,但那些都是無效的,就跟百度搜索前三十個字是有效的,你能夠輸進去不少,可是無效。
輸入條件 | 有效等價類 | 等價類編號 | 無效等價類 | 等價類編號 |
標識符首字符 | 字母 | 1 | 非字母 | 6 |
標識符組成 | 字母或數字組合 | 2 | 非字母和數字組合 | 7 |
保留字 | 8 | |||
標識符字符數 | 1~8個 | 3 | 0個 | 9 |
>8個 | 10 | |||
>80個 | 11 | |||
標識符個數(同一語句中) | 至少一個 | 4 | 0個 | 12 |
標識符使用 | 先說明後使用 | 5 | 未說明就使用 | 13 |
測試用例序號 | 輸入 | 預期結果 | 覆蓋範圍 |
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 |
在某程序設計語言的語法中規定:「標識符由字母開頭、後跟字母或數字的任意組合構成。有效字符數爲8個,最大字符數爲80個。」而且規定:「標識符必須先說明,再使用。」「在同一說明語句中,標識符至少必須有一個。」
根據上述的描述,利用等價類劃分法,獲得下表(表中括號中的數字爲等價類編號)。
輸入數據 | 有效等價列 | 無效等價類 |
---|---|---|
標識符個數 | 1個(1),多個(2) | 0個(3) |
標識符字符數 | 1-80個(4) | 0個(5),大於80個(6) |
標識符組成 | 字母(7),數字(8) | 非字母數字字符(9),保留字(10) |
第一個字符 | 字母(11) | 非字母(12) |
標識符使用 | 先說明後使用(13) | 未說明已使用(14) |
下面選取了八個測試用例,它們覆蓋了全部的等價類,請在下劃線中標出相應的等價類編號。
登陸用戶名由英文字母和數字組成,字符長度8-12位,不能僅有字母,也不能僅有數字,也不能有其餘非英文字母。用等價類劃分法設計測試用例。
輸入條件 | 有效等價類 | 編號 | 無效等價類 | 編號 |
用戶名長度 | 8~12位 | 1 | <8位 | 3 |
>12位 | 4 | |||
用戶名組成 | 英文字母和數字組合 | 2 | 只包含字母 | 5 |
只包含數字 | 6 | |||
包含其餘非英文字母 | 7 |
測試用例序號 | 用戶名輸入 | 預期結果 | 覆蓋類範圍 |
---|---|---|---|
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
同窗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);
]
請用白盒測試-分值覆蓋法設計測試。寫出思路,並進行描述。
序號 | 輸入 | 覆蓋分支 | 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的四位數字組成。後綴由四位數字組成。請用等價類劃分法設計測試。寫出思路,並進行描述。
輸入條件 | 有效等價類 | 等價類編號 | 無效等價類 | 等價類編號 |
地區碼 | 空白 | 1 | 包含非數字字符 | 5 |
長度<3 | 6 | |||
三位數字 | 2 | |||
長度>3 | 7 | |||
前綴 | 5000~9999 | 3 | 包含非數字字符 | 8 |
首位<5 | 9 | |||
長度<4 | 10 | |||
長度>4 | 11 | |||
後綴 | 四位數字 | 4 | 包含非數字字符 | 12 |
長度<4 | 13 | |||
長度>4 | 14 |
測試用例序號 | 輸入 | 預期結果 | 覆蓋範圍 | ||
區域碼 | 前綴 | 後綴 | |||
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 |
[1]軟工第五次上機PPT
[2]https://www.cnblogs.com/AlvinZH/p/7055708.html