《軟件測試和質(zhì)量管理》實驗報告三
一、目的和要求
????????1、掌握單元測試技術,并要求按照單元測試的要求設計測試用例;
????????2、掌握在Eclipse里進行Junit4測試的技術;
????????3、根據(jù)題目要求編寫測試用例;
????????4、實驗結(jié)果要求給出測試用例集測試效果比較;
????????5、撰寫實驗報告。
二、實驗內(nèi)容
日期問題:
測試以下程序:該程序有三個輸入變量month、day、year(month、day和year均為整數(shù)值,并且滿足:1≤month≤12、1≤day≤31和1900≤ year ≤2050),分別作為輸入日期的月份、日、年份,通過程序可以輸出該輸入日期在日歷上隔一天的日期。例如,輸入為 2004 年11月30日,則該程序的輸出為2004年12月1日。
(1)邊界值分析法設計測試用例;
(2)根據(jù)劃分的有效等價類,給出問題規(guī)定的可能采取的操作,畫出簡化后的決策表。
三、測試用例的編寫
3.1 邊界值分析法設計測試用例
(1)劃分等價類并編號
本題按照三個輸入變量年year、月month、日day的輸入條件:均為整數(shù)值并滿足1≤month≤12、1≤day≤31和1900≤year≤2050,程序輸出條件:需要有對平閏年、大小月、跨年月的測試,進行等價類劃分,形成等價類表,并為每一等價類規(guī)定唯一編號。最終得到的等價類表如下表3-1所示。
表3-1等價類表
輸入數(shù)據(jù) |
有效等價類 |
無效等價類 |
年(Year) |
(1)1900~2050之間的平年 (2)1900~2050之間的閏年 |
(11)Year<1900 (12)Year>2050 (13)非數(shù)串 |
月(Month) |
(3)Month=2(2月) (4)Month={1,3,5,7,8,10}(大月) (5)Month=12(跨年月) (6)Month={4,6,9,11}(小月) |
(14)Month<1 (15)Month>12 (16)非數(shù)串 |
日(Day) |
(7)1~28所有日(正常) (8)Day=29(閏年2月) (9)Day=30(小月) (10)Day=31(大月) |
(17)Day<1 (18)Day>28(平年2月) (19)Day>29(閏年2月) (20)Day>30(小月) (21)Day>31(大月) (22)非數(shù)串 |
(2)測試用例
表3-2邊界值測試用例表
用例 編號 |
輸入?yún)?shù) |
期望輸出 |
邊界 |
||
Year |
Month |
Day |
|||
1 |
1899 |
1 |
1 |
年的值不在指定范圍內(nèi) |
year上邊界 |
2 |
1900 |
1 |
1 |
1900年1月2日 |
year上邊界 |
3 |
1901 |
1 |
1 |
1901年1月2日 |
year上邊界 |
4 |
2000 |
1 |
1 |
2000年1月2日 |
year健壯 |
5 |
2049 |
1 |
1 |
2049年1月2日 |
year下邊界 |
6 |
2050 |
1 |
1 |
2050年1月2日 |
year下邊界 |
7 |
2051 |
1 |
1 |
年的值不在指定范圍內(nèi) |
year下邊界 |
8 |
2023 |
0 |
1 |
月的值不在指定范圍內(nèi) |
month上邊界 |
9 |
2023 |
1 |
1 |
2023年1月2日 |
month上邊界 |
10 |
2023 |
2 |
1 |
2023年2月2日 |
month上邊界 |
11 |
2023 |
5 |
1 |
2023年5月2日 |
month健壯 |
12 |
2023 |
11 |
1 |
2023年11月2日 |
month下邊界 |
13 |
2023 |
12 |
1 |
2023年12月2日 |
month下邊界 |
14 |
2023 |
13 |
1 |
月的值不在指定范圍內(nèi) |
month下邊界 |
15 |
2023 |
1 |
0 |
日的值不在指定范圍內(nèi) |
day上邊界 |
16 |
2023 |
1 |
1 |
2023年1月2日 |
day上邊界 |
17 |
2023 |
1 |
2 |
2023年1月3日 |
day上邊界 |
18 |
2023 |
1 |
15 |
2023年1月16日 |
day健壯 |
19 |
2023 |
2 |
27 |
2023年2月28日 |
平年2月下邊界 |
20 |
2023 |
2 |
28 |
2022年3月1日 |
平年2月下邊界 |
21 |
2023 |
2 |
29 |
日的值不在指定范圍內(nèi) |
平年2月下邊界 |
22 |
2020 |
2 |
28 |
2020年2月29日 |
閏年2月下邊界 |
23 |
2020 |
2 |
29 |
2020年3月1日 |
閏年2月下邊界 |
24 |
2020 |
2 |
30 |
日的值不在指定范圍內(nèi) |
閏年2月下邊界 |
25 |
2023 |
1 |
30 |
2023年1月31日 |
大月day下邊界 |
26 |
2023 |
1 |
31 |
2023年2月1日 |
大月day下邊界 |
27 |
2023 |
1 |
32 |
日的值不在指定范圍內(nèi) |
大月day下邊界 |
28 |
2023 |
4 |
29 |
2023年4月30日 |
小月day下邊界 |
29 |
2023 |
4 |
30 |
2023年5月1日 |
小月day下邊界 |
30 |
2023 |
4 |
31 |
日的值不在指定范圍內(nèi) |
小月day下邊界 |
31 |
2023 |
5 |
4 |
2023年5月5日 |
普通 |
3.2?判定表驅(qū)動法設計用例
(1)條件樁設計
表3-3?條件樁
條件 |
具體 |
M1 |
month:只有30天的小月,如:4、6、9、11月 |
M2 |
month:除12月外有31天的大月,如:1、3、5、7、8、10月 |
M3 |
month:12月 |
M4 |
month:2月 |
D1 |
day:1≤day≤27 |
D2 |
day:day=28 |
D3 |
day:day=29 |
D4 |
day:day=30 |
D5 |
day:day=31 |
Y1 |
year:year是閏年 |
Y2 |
year:year是平年 |
(2)動作樁設計
動作 |
不存在 |
日期+1 |
日期置1 |
月份+1 |
月份置1 |
年份+1 |
動作樁 |
A0 |
A1 |
A2 |
A3 |
A4 |
A5 |
(3)判斷表設計
規(guī)則 |
1 2 3 |
4 |
5 |
6 7 8 9 |
10 |
11 12 13 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 22 |
C1 (month是) |
M1 |
M1 |
M1 |
M2 |
M2 |
M3 |
M3 |
M4 |
M4 |
M4 |
M4 |
M4 |
M4 |
C2 (day是) |
D1 D2 D3 |
D4 |
D5 |
D1 D2 D3 D4 |
D5 |
D1 D2 D3 D4 |
D5 |
D1 |
D2 |
D2 |
D3 |
D4 |
D4 D5 |
C2 (year是) |
? |
? |
? |
? |
? |
? |
? |
? |
Y1 |
Y2 |
Y1 |
Y2 |
? |
A0 (不存在) |
√ |
√ |
√ |
||||||||||
A1 (day+1) |
√ |
√ |
√ |
√ |
√ |
||||||||
A2 (day=1) |
√ |
√ |
√ |
√ |
√ |
||||||||
A3 (month+1) |
√ |
√ |
√ |
√ |
|||||||||
A4 (month=1) |
√ |
||||||||||||
A5 (year+1) |
√ |
(4)測試用例
用例 編號 |
輸入?yún)?shù) |
期望輸出 |
||
Year |
Month |
Day |
||
1-3 |
2023 |
4 |
23 |
2023年4月24日 |
4 |
2023 |
6 |
30 |
2023年7月1日 |
5 |
2023 |
9 |
31 |
日的值不在指定范圍內(nèi) |
6-9 |
2023 |
5 |
4 |
2023年5月5日 |
10 |
2023 |
5 |
31 |
2023年6月1日 |
11-14 |
2023 |
12 |
15 |
2023年12月16日 |
15 |
2023 |
12 |
31 |
2024年1月1日 |
16 |
2023 |
2 |
14 |
2023年2月15日 |
17 |
2020 |
2 |
28 |
2020年2月29日 |
18 |
2023 |
2 |
28 |
2023年3月1日 |
19 |
2020 |
2 |
29 |
2020年3月1日 |
20 |
2023 |
2 |
29 |
日的值不在指定范圍內(nèi) |
21,?22 |
2023 |
2 |
30 |
日的值不在指定范圍內(nèi) |
四、測試結(jié)果的分析
4.1 邊界值分析法測試結(jié)果
(1)測試代碼
package?com.softtest.danyuan.test;
import?static?org.junit.Assert.*;
import?java.util.Arrays;
import?java.util.Collection;
import?org.junit.Assert;
import?org.junit.Test;
import?org.junit.runner.RunWith;
import?org.junit.runners.Parameterized;
import?org.junit.runners.Parameterized.Parameter;
import?org.junit.runners.Parameterized.Parameters;
import?com.softtest.danyuan.*;
@RunWith(Parameterized.class)
public?class?DanYuanTest?{
?
@Parameter
public?String?input1;
@Parameter(1)
?public?String?input2;
?@Parameter(2)
?public?String?input3;
?@Parameter(3)
?public?String?expected;
????@Parameters
????public?static?Collection<?>?prepareData(){
????????return?Arrays.asList(new?Object[][]{
?????????//?邊界值測試用例
?????????{"1899",?"1",?"1",?"年的值不在指定范圍內(nèi)"},??????//0
?????????{"1900",?"1",?"1",?"下一天是1900年1月2日"},????//1
?????????{"1901",?"1",?"1",?"下一天是1901年1月2日"},????//2
?????????{"1901",?"1",?"1",?"下一天是1901年1月2日"},????//3
?????????{"2000",?"1",?"1",?"下一天是2000年1月2日"},????//4
?????????{"2049",?"1",?"1",?"下一天是2049年1月2日"},????//5
?????????{"2050",?"1",?"1",?"下一天是2050年1月2日"},????//6
?????????{"2051",?"1",?"1",?"年的值不在指定范圍內(nèi)"},??????//7
?????????{"2023",?"0",?"1",?"月的值不在指定范圍內(nèi)"},??????//8
?????????{"2023",?"1",?"1",?"下一天是2023年1月2日"},????//9
?????????{"2023",?"2",?"1",?"下一天是2023年2月2日"},????//10
?????????{"2023",?"5",?"1",?"下一天是2023年5月2日"},????//11
?????????{"2023",?"11",?"1",?"下一天是2023年11月2日"},??//12
?????????{"2023",?"12",?"1",?"下一天是2023年12月2日"},??//13
?????????{"2023",?"13",?"1",?"月的值不在指定范圍內(nèi)"},?????//14
?????????{"2023",?"1",?"0",?"日的值不在指定范圍內(nèi)"},??????//15
?????????{"2023",?"1",?"1",?"下一天是2023年1月2日"},????//16
?????????{"2023",?"1",?"2",?"下一天是2023年1月3日"},????//17
?????????{"2023",?"1",?"15",?"下一天是2023年1月16日"},??//18
?????????{"2023",?"2",?"27",?"下一天是2023年2月28日"},??//19
?????????{"2023",?"2",?"28",?"下一天是2023年3月1日"},???//20
?????????{"2023",?"2",?"29",?"日的值不在指定范圍內(nèi)"},?????//21
?????????{"2020",?"2",?"28",?"下一天是2020年2月29日"},??//22
?????????{"2020",?"2",?"29",?"下一天是2020年3月1日"},???//23
?????????{"2020",?"2",?"30",?"日的值不在指定范圍內(nèi)"},?????//24
?????????{"2023",?"1",?"30",?"下一天是2023年1月31日"},??//25
?????????{"2023",?"1",?"31",?"下一天是2023年2月1日"},???//26
?????????{"2023",?"1",?"32",?"日的值不在指定范圍內(nèi)"},?????//27
?????????{"2023",?"4",?"29",?"下一天是2023年4月30日"},??//28
?????????{"2023",?"4",?"30",?"下一天是2023年5月1日"},???//29
?????????{"2023",?"4",?"31",?"日的值不在指定范圍內(nèi)"},?????//30
?????????{"2023",?"5",?"4",?"下一天是2023年5月5日"},????//31
????????});
????}
????public?void?DateTests(String?input1,String?input2,String?input3,String?expected){
????????this.input1?=?input1;
????????this.input2?=?input2;
????????this.input3?=?input3;
????????this.expected?=?expected;
????}
?@Test
?public?void?testNextDate()?{
??String?result?=?DanYuan.nextDate(input1,input2,input3);
??System.out.println(input1?+?'年'?+?input2?+?'月'+?input3?+'日');
??System.out.println(result);
??System.out.println(this.expected);
??System.out.flush();
????????Assert.assertEquals(this.expected,result);
?}
}
(2)結(jié)果截圖
錯誤用例:
(3)缺陷分析
現(xiàn)針對上述測試到的錯誤用例詳細分析源代碼的錯誤。
1、分析1:
按實際情況來看,編寫的“1899年1月1日”、“2051年1月1日”兩個用例的年份超出題給范圍,應輸出“年的值不在指定范圍內(nèi)”。由此,推斷源代碼中對于年份范圍的判斷部分的代碼出錯。
程序修改:將源程序中“year<1000||year>3000”改為“year<1900||year>20500”。
2、分析2:
按實際情況來看,編寫的“2023年1月0日”日期超出題給范圍,應輸出“日的值不在指定范圍內(nèi)”。由此,推斷源代碼中對于日期范圍的判斷部分的代碼出錯。
在源程序中,沒有先判斷接收的三個參數(shù)是否在指定范圍內(nèi),而是先根據(jù)month進行數(shù)據(jù)處理,再判斷處理后的參數(shù)是否在指定范圍內(nèi)。此用例雖然最初的三個參數(shù)中day=0不符合指定范圍,但程序并不判斷,而是在經(jīng)過數(shù)據(jù)處理day=1后才判斷,此時符合了指定范圍讓其輸出。
程序修改:先判斷接收的三個參數(shù)是否在指定范圍內(nèi),再根據(jù)month進行數(shù)據(jù)處理。
3、分析3:
編寫的“2023年2月29日”用例,由于平年沒有2月29日,應當輸出日的值不在指定范圍內(nèi)。由此,推斷源代碼對2月日期判斷部分代碼出錯。
在2月判別部分代碼中,程序只有檢測到day==28時,才會進入平年閏年的判斷。從而導致,在平年情況下判斷2月29日的下一天時,直接進入了分支判斷day==29,程序輸出結(jié)果為當年的3月1日,而不是“日的值不在指定范圍內(nèi)”。
程序修改:在2月部分中先判斷平年閏年,而后根據(jù)年份再選擇具體日期的判斷。若為閏年,當day=29時,輸出下一天為當年的3月1日;當day<29時,輸出日期+1;其余情況均為日的值不在指定范圍內(nèi)。若為平年,當day=28時,輸出下一天為當年的3月1日;當day<28時,輸出日期+1;其余情況均為日的值不在指定范圍內(nèi)。
(4)nextDate代碼修改
package?com.softtest.danyuan;
public?class?DanYuan?{
??public?static?String?nextDate(String?s_year,?String?s_month,?String?s_day)?{
??????//將字符串轉(zhuǎn)為int
??????int?year?=?Integer.parseInt(s_year);
??????int?month?=?Integer.parseInt(s_month);
??????int?day?=?Integer.parseInt((s_day));
??????boolean?flag?=?false;
??????if?(year?<?1900?||?year?>?2050)?{
??????????return?("年的值不在指定范圍內(nèi)");
??????}?else?if?(month?>?12?||?month?<?1)?{
??????????return?("月的值不在指定范圍內(nèi)");
??????}?else?if?(day?>?31?||?day?<?1)?{
??????????return?("日的值不在指定范圍內(nèi)");
??????}
??????
??????switch?(month)?{
??????????case?1:
??????????case?3:
??????????case?5:
??????????case?7:
??????????case?8:
??????????case?10:
??????????????if?(day?==?31)?{
??????????????????day?=?1;
??????????????????month?=?month?+?1;
??????????????}?
??????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?4:
??????????case?6:
??????????case?9:
??????????case?11:
??????????????if?(day?==?30)?{
??????????????????day?=?1;
??????????????????month?=?month?+?1;
??????????????}?
??????????????else?if?(day?==?31)?{
??????????????????flag?=?true;
??????????????}?
??????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?12:
??????????????if?(day?==?31)?{
??????????????????day?=?1;
??????????????????month?=?1;
??????????????????year?=?year?+?1;
??????????????}?
??????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?2:?{
???????????if?(((year?%?4?==?0?&&?year?%?100?!=?0)?||?year?%?400?==?0))?{
??????????????????//?閏年
??????????????????if?(day?==?29)?{
??????????????????????day?=?1;
??????????????????????month?=?3;
??????????????????}?
??????????????????else?if?(day?<?29)?{
??????????????????????day?=?day?+?1;
??????????????????}?
??????????????????else?{
??????????????????????flag?=?true;
??????????????????}
??????????????}?else?{
??????????????????//平年
??????????????????if?(day?==?28)?{
??????????????????????day?=?1;
??????????????????????month?=?3;
?????????????????}?
??????????????????else?if?(day?<?28)?{
??????????????????????day?=?day?+?1;
??????????????????}?
??????????????????else?{
??????????????????????flag?=?true;
??????????????????}
??????????????}
??????????}
??????????break;
??????????default:
??????}
??????if?(flag)?{
??????????return?("日的值不在指定范圍內(nèi)");
??????}?
??????else?{
??????????return?("下一天是"?+?year?+?"年"?+?month?+?"月"?+?day?+?"日");
??????}
?}
}
(5)代碼修改后用例測試
代碼修正后再次驗證,此時所有設計的用例均測試通過。
4.2?判定表驅(qū)動法測試結(jié)果
(1)測試代碼
package?com.softtest.danyuan.test;
import?static?org.junit.Assert.*;
import?java.util.Arrays;
import?java.util.Collection;
import?org.junit.Assert;
import?org.junit.Test;
import?org.junit.runner.RunWith;
import?org.junit.runners.Parameterized;
import?org.junit.runners.Parameterized.Parameter;
import?org.junit.runners.Parameterized.Parameters;
import?com.softtest.danyuan.*;
@RunWith(Parameterized.class)
public?class?DanYuanTest?{
?
?@Parameter
?public?String?input1;
?@Parameter(1)
?public?String?input2;
?@Parameter(2)
?public?String?input3;
?@Parameter(3)
?public?String?expected;
????@Parameters
????public?static?Collection<?>?prepareData(){
????????return?Arrays.asList(new?Object[][]{
?????????//?判定表驅(qū)動法用例
?????????{"2023",?"4",?"23",?"下一天是2023年4月24日"},???//0
?????????{"2023",?"6",?"30",?"下一天是2023年7月1日"},????//1
?????????{"2023",?"9",?"31",?"日的值不在指定范圍內(nèi)"},??????//2
?????????{"2023",?"5",?"4",?"下一天是2023年5月5日"},?????//3
?????????{"2023",?"5",?"31",?"下一天是2023年6月1日"},????//4
?????????{"2023",?"12",?"15",?"下一天是2023年12月16日"},?//5
?????????{"2023",?"12",?"31",?"下一天是2024年1月1日"},???//6
?????????{"2023",?"2",?"14",?"下一天是2023年2月15日"},???//7
?????????{"2020",?"2",?"28",?"下一天是2020年2月29日"},???//8
?????????{"2023",?"2",?"28",?"下一天是2023年3月1日"},????//9
?????????{"2020",?"2",?"29",?"下一天是2020年3月1日"},????//10
?????????{"2023",?"2",?"29",?"日的值不在指定范圍內(nèi)"},??????//11
?????????{"2023",?"2",?"30",?"日的值不在指定范圍內(nèi)"},??????//12
????????});
????}
????public?void?DateTests(String?input1,String?input2,String?input3,String?expected){
????????this.input1?=?input1;
????????this.input2?=?input2;
????????this.input3?=?input3;
????????this.expected?=?expected;
????}
?@Test
?public?void?testNextDate()?{
??String?result?=?DanYuan.nextDate(input1,input2,input3);
??System.out.println(input1?+?'年'?+?input2?+?'月'+?input3?+'日');
??System.out.println(result);
??System.out.println(this.expected);
??System.out.flush();
????????Assert.assertEquals(this.expected,result);
?}
}
(2)結(jié)果截圖
(3)缺陷分析
現(xiàn)針對上述測試到的錯誤用例詳細分析源代碼的錯誤。
按實際情況來看,編寫的“2023年2月29日”用例,由于平年沒有2月29日,應當輸出日的值不在指定范圍內(nèi)。由此,推斷源代碼對2月日期判斷部分代碼出錯。
在2月判別部分代碼中,程序只有檢測到day==28時,才會進入平年閏年的判斷。從而導致,在平年情況下判斷2月29日的下一天時,直接進入了分支判斷day==29,程序輸出結(jié)果為當年的3月1日,而不是“日的值不在指定范圍內(nèi)”。
程序修改:在2月部分中先判斷平年閏年,而后根據(jù)年份再選擇具體日期的判斷。若為閏年,當day=29時,輸出下一天為當年的3月1日;當day<29時,輸出日期+1;其余情況均為日的值不在指定范圍內(nèi)。若為平年,當day=28時,輸出下一天為當年的3月1日;當day<28時,輸出日期+1;其余情況均為日的值不在指定范圍內(nèi)。
(4)代碼修改
package?com.softtest.danyuan;
public?class?DanYuan?{
??public?static?String?nextDate(String?s_year,?String?s_month,?String?s_day)?{
??????//將字符串轉(zhuǎn)為int
??????int?year?=?Integer.parseInt(s_year);
??????int?month?=?Integer.parseInt(s_month);
??????int?day?=?Integer.parseInt((s_day));
??????boolean?flag?=?false;
??????switch?(month)?{
??????????case?1:
??????????case?3:
??????????case?5:
??????????case?7:
??????????case?8:
??????????case?10:
??????????????if?(day?==?31)?{
??????????????????day?=?1;
??????????????????month?=?month?+?1;
? ????????????}?
?????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?4:
??????????case?6:
??????????case?9:
??????????case?11:
??????????????if?(day?==?30)?{
??????????????????day?=?1;
??????????????????month?=?month?+?1;
??????????????}?
??????????????else?if?(day?==?31)?{
??????????????????flag?=?true;
??????????????}?
??????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?12:
??????????????if?(day?==?31)?{
??????????????????day?=?1;
??????????????????month?=?1;
??????????????????year?=?year?+?1;
??????????????}?
??????????????else?{
??????????????????day?=?day?+?1;
??????????????}
??????????????break;
??????????case?2:?{
??????????????if?(((year?%?4?==?0?&&?year?%?100?!=?0)?||?year?%?400?==?0))?{
??????????????????//?閏年
??????????????????if?(day?==?29)?{
??????????????????????day?=?1;
??????????????????????month?=?3;
??????????????????}?
??????????????????else?if?(day?<?29)?{
??????????????????????day?=?day?+?1;
??????????????????}?
??????????????????else?{
??????????????????????flag?=?true;
??????????????????}
??????????????}?else?{
??????????????????//平年
??????????????????if?(day?==?28)?{
??????????????????????day?=?1;
??????????????????????month?=?3;
??????????????????}?
??????????????????else?if?(day?<?28)?{
??????????????????????day?=?day?+?1;
??????????????????}?
??????????????????else?{
??????????????????????flag?=?true;
?????????????????}
??????????????}
??????????}
??????????break;
??????????default:
??????}
?????if?(flag)?{
??????return?("日的值不在指定范圍內(nèi)");
????}
?????
????if?(year?>=?1900?&&?year?<=?2050?&&?month?<=?12?&&?month?>=?1?&&?day?<=?31?&&?day?>=?{
????????return?("下一天是"?+?year?+?"年"?+?month?+?"月"?+?day?+?"日");
????}?else?if?(year?<?1000?||?year?>?3000)?{
????????return?("年的值不在指定范圍內(nèi)");
????}?else?if?(month?>?12?||?month?<?1)?{
????????return?("月的值不在指定范圍內(nèi)");
????}?else?if?(day?>?31?||?day?<?1)?{
????????return?("日的值不在指定范圍內(nèi)");
????}
?return?"1";
?}
}
(5)代碼修改后用例測試
代碼修正后再次驗證,此時所有設計的用例均測試通過。
五、心得與體會
本次實驗,針對nextDate函數(shù),我使用junit5測試工具,利用黑盒測試中的邊界值分析法和判定表驅(qū)動法設計測試用例,根據(jù)測試到的出錯用例分析源碼,找出代碼錯誤后修正再次驗證,最終使設計的測試用例在修正后的nextDate函數(shù)中全部通過,成功掌握了用單元測試技術按要求設計測試用例。
邊界值分析法是對輸入或輸出的邊界值進行測試的一個黑盒測試方法,該方法是對等價類劃分法的一個補充,其測試設計基于有效等價類。其基本思想:在最小值(min)、略高于最小值(min+)、正常值(nom)、最大值(max)、略低于最大值(max-)處取輸入變量值,對系統(tǒng)進行驗證。經(jīng)驗表明,大量的缺陷是發(fā)生在輸入輸出的邊界值,而不是輸入輸出的范圍值。如果輸入條件規(guī)定了值的范圍,則應取剛達到這個范圍的邊界值以及剛剛超過這個范圍邊界的值作為測試輸入數(shù)據(jù)。如果輸入條件規(guī)定了值的個數(shù),則用最大個數(shù)、最小個數(shù)和比最大個數(shù)多1個、比最小個數(shù)少1個的數(shù)作為測試數(shù)據(jù)。找到每個輸入條件的邊界點,即可得到邊界?;趩芜吔缭瓌t設計測試用例,即每個邊界點及領域測試數(shù)據(jù)設計測試用例。
另外基于普通邊界值還需要設計健壯性邊界值分析的測試用例,將其中居中的數(shù)據(jù)也拿來保證健壯性測試,如year除了邊界值1和12月外,還可以拿6月這個居中值加入到測試用例當作健壯性測試。
此次實驗中,利用邊界值分析法我發(fā)現(xiàn)源程序存在的問題有:① 年份范圍的判斷部分的代碼出錯;② 沒有先判斷接收的三個參數(shù)是否在指定范圍內(nèi);③ 對2月日期判斷部分代碼出錯。并且通過修改代碼,再次檢驗用例均成功通過測試。
判定表驅(qū)動法表示的是有多個輸入和多個輸出,而且輸入與輸入之間有相互的組合關系、輸入和輸出之間有相互的制約和依賴關系。此次實驗中,利用判定表驅(qū)動法發(fā)現(xiàn)源程序?qū)?月日期判斷部分代碼出錯。并且通過修改代碼,再次檢驗用例均成功通過測試。文章來源:http://www.zghlxwxcb.cn/news/detail-848568.html
兩種方法測試用例集測試效果比較:基于邊界值分析法的測試用例集著重測試輸入和輸出的邊界情況;而基于判定表驅(qū)動法的測試用例集能夠?qū)碗s的問題按照各種可能的情況全部列舉出來,簡明并避免遺漏。一般情況下,邊界值分析法設計出的測試用例發(fā)現(xiàn)程序錯誤的能力更強,比如本次實驗中利用邊界值分析法發(fā)現(xiàn)了三處代碼錯誤,而判定表驅(qū)動法只發(fā)現(xiàn)了一處錯誤。而判定表驅(qū)動法更適合于針對不同邏輯條件的組合值需要分別執(zhí)行不同的操作的數(shù)據(jù)處理問題,經(jīng)過化簡相比邊界值測試用例集要小。文章來源地址http://www.zghlxwxcb.cn/news/detail-848568.html
到了這里,關于軟件測試和質(zhì)量管理——實驗3:單元測試的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!