使用等价类划分法为NextDate函数设计测试用例
- 格式:doc
- 大小:19.00 KB
- 文档页数:2
NextDate函数的等价类测试用例NextDate是一个三变量函数,即月份、日期和年,这些变量的有效值区间定义如下:M1={月份:1≤月份≤12}D1={日期:1≤日期≤31}Y1={年:1812≤年≤2012}无效等价类:M2={月份:月份<1}M3={月份:月份>12}D2={日期:日期<1}D3={日期:日期>31}Y2={年:年<1812}Y3={年:年>2012}由于有效类的数量等于独立变量的个数,因此只有弱一般等价类测试用例出现,并且与强一般等价类测试用例相同:用例ID 月份日期年预期输出WN1,SN1 6 15 1912 1912年6月16日用例ID 月份日期年预期输出WR1 6 15 1912 1912年6月16日WR2 -1 15 1912 月份不在有效值域1..12中WR3 13 15 1912 月份不在有效值域1..12中WR4 6 -1 1912 日期不在有效值域1..31中WR5 6 32 1912 日期不在有效值域1..31中WR6 6 15 1811 年不在有效值域1812..2012中WR7 6 15 2013 年不在有效值域1812..2012中强健壮等价类测试用例集合:用例ID 月份日期年预期输出SR1 -1 15 1912 月份不在有效值域1..12中SR2 6 -1 1912 日期不在有效值域1..31中SR3 6 15 1811 年不在有效值域1812..2012中SR4 -1 -1 1912 月份不在有效值域1..12中日期不在有效值域1..31中SR5 6 -1 1811 日期不在有效值域1..31中年不在有效值域1812..2012中SR6 -1 15 1811 月份不在有效值域1..12中年不在有效值域1812..2012中SR7 -1 -1 1811 月份不在有效值域1..12中日期不在有效值域1..31中年不在有效值域1812..2012中。
老师第一题没装编程的软件先做了后面的俩个题2、根据边界值分析法为三角形问题编写测试用例。
三角形问题的边界值分析测试用例测试用例 a b e 预期输出Test1 Test2 Test3 Test4 Test5 60606050506060605050126099100等腰三角形等腰三角形等边三角形等腰三角形非三角形Test6 Test7 Test8 Test9 60605050129910060605050等腰三角形等腰三角形等腰三角形非三角形Test10 Test11 Test12 Test1312991006060505060605050等腰三角形等腰三角形等腰三角形非三角形3、根据等价类划分法为nextdate函编写测试用例。
有效等价类编号无效等价类编号1912<=year<=2050 1year<1912 4year>2050 5 year有非数字字符 61<=month<=12 2month<1 7month>12 8 Month有非数字字符91<=day<=31 3day<1 10day>31 11 Day有非数字字符12Y ear.month.day 编号Y ear.month.day 编号2006 6 6 1.2.3 2006 0 6 1.3.7 2006 6 a 1.2.12 2006 15 6 1.3.8 2006 a 6 1.3.9 2006 6 0 1.2.10 200a 6 6 2.3.7 2006 6 33 1.2.11 5555 6 6 2.3.61111 6 6 2.3.4000000000000000000000000000。
黑盒测试作业参考答案.黑盒测试参考答案第三章(注意:答案仅供参考,若有误,请自行修改。
) 1、某保险公司计算保险费率。
,点以上保险费率为0.6%计算方式为10点及10;而点数又是由投保0.1%点以下保险费率为10人的年龄、性别、婚姻状况和抚养人数来决定,年龄有效输入范围其中,具体规则如下表所示。
之间的1-9为1-100;抚养人数可输入“无”或整数。
使用等价类划分进行测试用例设计抚养人性婚年未 M F 已20~39 40~59 0.人最多参考答案:(1)通过对程序功能的分析,其等价类表如下所示:输入条有效等价类无效等价类件 20~39岁(1)小于1岁 40~59岁(11)年龄(2)于100岁大或岁1~19(12)岁60~100 (3).M' (4)除‘M'和‘F'之‘性别‘F 外的其他字符(13)'(5)(外除已婚和未婚之6)已婚婚姻未婚(7的其他字符(14))的外字除无和数之(8)无15)其他字符抚养人(9) 1~6人((数16)1 小于16~19大)设计测试用例表,覆盖等价类。
(输入数覆盖预期输保险费等价性0.6%1 4 6 8127M0.6%2 5 7 92F2503 4 6100.13770M提示“年龄11 4 6 8已4 M 无 0在之间”1~100婚提示“年龄应未12 5 7 9 5 4 F 102 1~100 婚之间”在提示“性别应已1 13 6 8 306 无T”F或M输入婚1 4 14 8 提示“婚姻应离无为30 M 已婚或未7 婚婚”1 4 6 15提示“抚养M830之间的1-数提示“抚养1 4 6 16 -1930M1-之间的数1 4 6 17提示“抚养201030M1-之间的数2、NextDate函数。
该函数要求输入三个变量month、day和year,输出该日期之后一天的日期。
其中year的取值范围为:1900-2079。
如果输入的日期组合不合法,则显示“无效的输入日期”。
NextDate函数测试用例选择NextDate函数,是因为它可以说明输入定义域中的依赖性问题,这使得这个例子成为基于决策表测试的一个完美例子,因为决策表可以突出这种依赖关系。
从前面对等价类测试的分析我们知道,等价类分析假设所有的变量都是独立的。
如果变量确实是独立的,则使用类的笛卡尔积是有意义的。
如果变量之间在输入定义域中存在逻辑依赖关系,则这些依赖关系在笛卡尔积中就会丢失(说抑制可能更确切)。
决策表格式通过使用“不可能动作”概念表示条件的不可能组合,使我们能够强调这种依赖关系。
下面将对NextDate函数的决策表描述做三次尝试。
第一次尝试标识合适的条件和动作,假设首先从分析等价类集合开始。
M1= {月份:每月有30天};M2 = {月份:每月有31天};M3二{月份:此月是2月}D1 = {日期:1<0期W 28}; D2 = {日期:日期=29}; D3 = {日期=30}; D4 = {日期=31}Y1 = {年:年是闰年}; Y2 = {年:年不是闰年}如果我们希望突出不可能的组合,则可以建立具有以下条件和动作的有限项决策表。
(请注意,年变量对应的等价类收缩为下表的一个条件。
)有2处条规则的第一袂尝试这个决策表会有256条规则,其中很多是不可能的。
如果要显示为什么这些规则是不可能的,可将动作修改为:al:月份中的天数太多;a2:不能出现在非闰年中;a3:计算NextDate.第二次尝试如果我们将注意力集中到NextDate函数的闰年问题上,则可以修改已有的等价类集合。
为了说明另一种决策表表示方法,这一次采用扩展项决策表开发,并更仔细地研究动作桩。
在构建扩展项决策表时,必须保证等价类构成输入定义域的真划分。
如果规则项之间存在“重叠”,则会存在冗余情况,使得多个规则都能够满足。
这里,Y2是一组1812〜2012之间的年份,并除以4, 2000除外。
M1= {月份:每月有30天}; M2 = {月份:每月有31天}; M3二{月份:此月是2月}D1 = {日期:1<0期W 28}; D2 = {日期:日期=29}; D3 = {日期=30}; D4 = {日期=31}Y1 = {年:年=2000}; Y2 = {年:年是闰年}; Y3 = {年:年是平年}从某种意义上说,我们采用的是“灰盒”技术,因为更仔细地研究了NextDate 函数。
1、使用等价类划分法为NextDate函数设计测试用例:NextDate函数包含三个输入变量month、day和year(要求month、day和year 均为整数值,并且满足:1≤month≤12; 1≤day≤31;1912≤year≤2050),函数的输出为输入日期后一天的日期。
(1)列出输入域等价类表(包括有效和无效等价类)。
(2)根据(1)中的等价类,设计能覆盖所有等价类的测试用例,要求包括输入数据和预期输出,并指出各个测试用例所覆盖的等价类编号。
2、某城市电话号码由三部分组成,分别是:地区码——空白或者三位数字;前缀——非‘0’或‘1’开头的三位数字;后缀——4位数字。
假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的电话号码。
(1)列出输入域等价类表(包括有效和无效等价类)。
(2)根据(1)中的等价类表,设计能覆盖所有等价类的测试用例,要求包括输入数据和预期输出,并指出各个测试用例覆盖的等价类编号。
3、使用基本路径测试方法测试以下程序段:V oid sort(int irecordnum,int itype)1{2Int x = 0;3Int y = 0;4While( irecordnum -- >0 )5{6If( itype == 0)7Break;8Else9If(itype == 1)10x = x+10;11Else12y = y+20;13}14}说明:写在程序段某些行开头数字(1~14)是对每条语句的编号。
(1)画出程序的控制流程图(用题中给出的语句编号表示)。
(2)计算上述程序段的环形复杂度。
(3)导出基本路径集,列出程序的独立路径(用题中给出的语句编号表示)。
请根据(3)中的独立路径,设计测试用例的输入数据和预期输出。
4、使用基本路径测试方法测试以下程序段:Int IsGood( int grade ){① If (grade <= 100){② If( grade >= 80 ){③ If(year >= 90 )④ Result = 2; //优秀Else⑤ Result = 1; //良好}Else if(grade >= 0)⑥ Result = 0; //合格Else⑦ Result = -1; //分数为负数}Else⑦ Result = -1; //分数大于100⑧ Return Result;}说明:写在程序段某些行开头数字(①~⑧)是对应语句的编号。
NextData函数一、问题描述程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12、1≤day≤31、1900≤year ≤2050。
),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。
例如,输入为2005年11月29日,则该程序的输出为2005年11月30日。
请用黑盒测试方法设计测试用例。
二、程序界面计算下一天的程序代码见附录。
三、设计测试用例1. 用边界值测试方法设计测试用例用健壮性测试法设计测试用例,按照下列步骤进行:(1)分析各变量的取值健壮性测试时,各变量分别取:略小于最小值、最小值、略高于最小值、正常值、略低于最大值、最大值和略大于最大值。
month:-1,1,2,6,11,12,13;day:-1,1,2,15,30,31,32year:1899,1900,1901,1975,2049,2050,2051;(2)测试用例数有n个变量的程序,其边界值分析会产生6n+1个测试用例。
这里有3个变量,因此会产生19个测试用例。
(3)设计测试用例,见表1-1。
NextDate函数的复杂性来源于两个方面:一是输入域的复杂性(即输入变量之间逻辑关系的复杂性),二是确定闰年的规则。
但是在进行健壮性测试时,没有考虑输入变量之间的逻辑关系,也没有考虑和闰年相关的问题,因此在设计测试用例时存在遗漏问题,比如和判断闰年相关的日期:2008.2.29、1999.2.28等。
表1-1NextDate函数测试用例2. 用基于判定表的方法设计测试用例(1)分析各种输入情况,列出为输入变量month、day、year划分的有效等价类。
month变量的有效等价类:M1 = { month = 4,6,9,11 }M2 = { month = 1,3,5,7,8,10 }M3 = { month = 12 }M4 = { month = 2 }day变量的有效等价类:D1={日期:1≤日期≤27}D2={日期:日期=28}D3={日期:日期=29}D4={日期:日期=30}D5={日期:日期=31}year变量的有效等价类:Y1 = { year是闰年}Y2 = { year不是闰年}(2)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。
NextDate函数测试用例选择NextDate函数,是因为它可以说明输入定义域中的依赖性问题,这使得这个例子成为基于决策表测试的一个完美例子,因为决策表可以突出这种依赖关系。
从前面对等价类测试的分析我们知道,等价类分析假设所有的变量都是独立的。
如果变量确实是独立的,则使用类的笛卡尔积是有意义的。
如果变量之间在输入定义域中存在逻辑依赖关系,则这些依赖关系在笛卡尔积中就会丢失(说抑制可能更确切)。
决策表格式通过使用“不可能动作”概念表示条件的不可能组合,使我们能够强调这种依赖关系。
下面将对NextDate函数的决策表描述做三次尝试。
第一次尝试标识合适的条件和动作,假设首先从分析等价类集合开始。
M1 = {月份:每月有30天};M2 = {月份:每月有31天};M3 = {月份:此月是2月}D1 = {日期:1≤日期≤28};D2 = {日期:日期=29};D3 = {日期=30};D4 = {日期=31}Y1 = {年:年是闰年};Y2 = {年:年不是闰年}如果我们希望突出不可能的组合,则可以建立具有以下条件和动作的有限项决策表。
(请注意,年变量对应的等价类收缩为下表的一个条件。
)这个决策表会有256条规则,其中很多是不可能的。
如果要显示为什么这些规则是不可能的,可将动作修改为:a1:月份中的天数太多;a2:不能出现在非闰年中;a3:计算NextDate。
第二次尝试如果我们将注意力集中到NextDate函数的闰年问题上,则可以修改已有的等价类集合。
为了说明另一种决策表表示方法,这一次采用扩展项决策表开发,并更仔细地研究动作桩。
在构建扩展项决策表时,必须保证等价类构成输入定义域的真划分。
如果规则项之间存在“重叠”,则会存在冗余情况,使得多个规则都能够满足。
这里,Y2是一组1812~2012之间的年份,并除以4,2000除外。
M1 = {月份:每月有30天};M2 = {月份:每月有31天};M3 = {月份:此月是2月}D1 = {日期:1≤日期≤28};D2 = {日期:日期=29};D3 = {日期=30};D4 = {日期=31}Y1 = {年:年=2000};Y2 = {年:年是闰年};Y3 = {年:年是平年}从某种意义上说,我们采用的是“灰盒”技术,因为更仔细地研究了NextDate函数。
软件测试-nextDate问题NextDate 函数包含三个变量:month 、 day 和 year ,函数的输出为输⼊⽇期后⼀天的⽇期。
例如,输⼊为 2006年3⽉ 7⽇,则函数的输出为 2006年3⽉8⽇。
要求输⼊变量 month 、 day 和 year 均为整数值,并且满⾜下列条件:①1≤month≤12②1≤day≤31③1920≤year≤20501)有效等价类为:M1={⽉份:1≤⽉份≤12}D1={⽇期:1≤⽇期≤31}Y1={年:1812≤年≤2012}2)若条件① ~ ③中任何⼀个条件失效,则 NextDate 函数都会产⽣⼀个输出,指明相应的变量超出取值范围,⽐如 "month 的值不在 1-12 范围当中 " 。
显然还存在着⼤量的 year 、 month 、 day 的⽆效组合, NextDate 函数将这些组合作统⼀的输出: " ⽆效输⼊⽇期 " 。
其⽆效等价类为:M2={⽉份:⽉份<1}M3={⽉份:⽉份>12}D2={⽇期:⽇期<1}D3={⽇期:⽇期>31}Y2={年:年<1812}Y3={年:年>2012}弱⼀般等价类测试⽤例⽉份⽇期年预期输出6 15 1912 1912年6⽉16⽇强⼀般等价类测试⽤例同弱⼀般等价类测试⽤例注:弱--有单缺陷假设;健壮--考虑了⽆效值(⼀)弱健壮等价类测试⽤例ID ⽉份⽇期年预期输出WR1 6 15 1912 1912年6⽉16⽇WR2 -1 15 1912 ⽉份不在1~12中WR3 13 15 1912 ⽉份不在1~12中WR4 6 -1 1912 ⽇期不在1~31中WR5 6 32 1912 ⽇期不在1~31中WR6 6 15 1811 年份不在1812~2012中WR7 6 15 2013 年份不在1812~2012中(⼆)强健壮等价类测试强健性等价类测试⽤例可以包含多个⽆效值,即含有多个缺陷假设。
1:程序规定;输入三个整数作为三边的边长构成三角形。
当此三角形为一般三角形、等腰三角形、等边三角形时,分别作计算。
用等价类划分方法为该程序进行测试用例设计。
2:现有一个学生标准化考试批阅试卷,产生成绩报告的程序。
其规格说明如下:程序的输入文件由一些有80个字符的记录组成,所有记录分为3组,如图:1、标题:改组只有一个记录,其内容是成绩报告的名字。
2、各题的标准答案:每个记录均在第80个字符处标以数字2。
该组的记录:第一个记录:第1~3个字符为试题数(1~999)。
第10~59个字符是1~50题的标准答案(每个合法字符表示一个答案)。
第二个记录:是第51~100题的标准答案。
…….3、学生的答案:每个记录均在第80个字符处标以数字3。
每个学生的答卷在若干个记录中给出。
学号:1~9个字符1~50题的答案:10~59。
当大于50题时,在第二、三、……个记录中给出。
学生人数不超过200,试题数不超过999。
程序的输出有4个报告:a)按学号排列的成绩单,列出每个学生的成绩、名次。
b)按学生成绩排序的成绩单。
c)平均分数及标准偏差的报告d)试题分析报告。
按试题号排序,列出各题学生答对的百分比。
1. 黑盒测试的具体技术方法有哪些?答案: 黑盒测试的具体技术方法主要有边界值分析法、等价类划分法、因果图法、决策表测试法、场景法等。
2. 分析如何选择恰当的黑盒测试方法。
答案: 通常在决定测试策略时,有以下的参考原则:①在任何情况下都必须采用边界值分析法。
这种方法设计出的测试用例发现程序错误的能力最强。
②必要时采用等价划分类方法补充测试用例。
③采用错误推断法再追加测试用例。
④对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度。
如果没有达到要求的覆盖标准,则应当在补充更多的测试用例。
⑤如果程序的功能说明中含有输入条件的组合情况,则应在一开始就选用因果图法。
3. 解释黑盒测试的概念。
答案: 黑盒测试被称为功能测试或数据驱动测试。
1.测试程序源代码#include"stdafx。
h"#include <iostream>using namespace std;void NextDate(int year,int month,int day);void main(){int year=0,month=0,day=0;NextDate(year,month,day);}void NextDate(int year,int month,int day){cout〈<”请输入年份:”<<endl;cin>>year;while(!(year>=1911 && year<=2013)){cout<<"年份超过界限,请重新输入”<〈endl;cin>〉year;}cout<〈”请输入月份:"<〈endl;cin〉〉month;while (month〉12||month<1){cout〈〈”月份输入有误,请重新输入"<〈endl;cin>>month;}cout<〈”请输入日期:"<〈endl;cin〉>day;while (day〉31||day<1){cout〈〈”日期输入有误,请重新输入"〈<endl;cin>>day;}while(month==4&&day==31||month==6&&day==31||month==9&&day==31||month==11&&day==31) {cout〈<”小月没有31号”〈<endl;cin〉>day;} if((year%4==0 && year%100!=0) ||(year%400==0)) //检查闰年;{int i=0;i=day-29;while(month==2&&i〉0){cout〈〈”本月是闰月,请在1-29之间从新输入日期"<〈endl;cin〉>day;}if(month==2&&day==29){month=3;day=1;}else day++;}else day++;//月底计算;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:if (day==32){month++;day=1;cout<<"明天是:"<<year〈〈’/'〈<month〈<’/'<〈day<〈endl;}break;case 2:if(day==29){month=3;day=1;cout〈〈"明天是:"〈<year〈<’/’〈<month<<'/'<<day<<endl;}break;case 4:case 6:case 9:case 11:if(day==31){month++;day=1;cout<〈"明天是:"〈<year〈〈’/'〈<month〈<'/’<<day〈<endl;}break;case 12:if(day==32){year++;month=1;day=1;cout〈<"明天是:”〈<year<〈’/’<〈month<<’/’〈<day〈〈endl;}break;}cout〈〈”明天是:”<<year<〈’/'〈〈month<〈'/’〈〈day<<endl;}白盒测试7DD-路径情况1. 由一个节点组成,内度=0情况2。
Java⿊盒测试之nextDate函数测试⽬录⼀、实验⽬的⼆、实验内容三、实验要求四、实验过程五、缺陷分析⼀、实验⽬的(1)掌握应⽤⿊盒测试技术进⾏测试⽤例设计。
(2)掌握对测试⽤例进⾏优化设计⽅法。
⼆、实验内容⽇期问题测试以下程序:该程序有三个输⼊变量month、day、year(month、day和year均为整数值,并且满⾜:1≤month≤12、1≤day≤31和1900≤year≤2050),分别作为输⼊⽇期的⽉份、⽇、年份,通过程序可以输出该输⼊⽇期在⽇历上隔⼀天的⽇期。
例如,输⼊为2004 年11⽉30⽇,则该程序的输出为2004年12⽉1⽇。
(1)划分等价类,按照等价类划分法设计测试⽤例;(2)编写nextDate函数;(3)掌握Junit4的⽤法,使⽤Junit4测试nextDate函数。
JUnit4是JUnit框架有史以来的最⼤改进,其主要⽬标便是利⽤Java5的Annotation特性简化测试⽤例的编写。
掌握Junit4定义的⼀些常见Annotations:org.junit.Testorg.junit.Beforeorg.junit.Afterorg.junit.BeforeClassorg.junit.AfterClassorg.junit.Ignoreorg.junit.runner.RunWithorg.junit.runners.Suite.SuiteClassesorg.junit.runners.Parameterized.Parameters三、实验要求(1)根据题⽬要求编写测试⽤例;(2)准备nextDate函数,使⽤Junit4测试执⾏测试;(3)撰写实验报告。
四、实验过程(1)根据题⽬要求编写测试⽤例1)划分等价类并编号输⼊数据有效等价类⽆效等价类年(1) 1900到2050内的闰年整数(10) year<1900(2) 1900到2050内的平年整数(11) year>2050(12) 其他输⼊⽉(3) 1,3,5,7,8,10,12内的整数(13) month<1(4) 4,6,9,11内的整数(14) 12<month(5) 2(15) 其他输⼊⽇(6) 1~28(16) day<1(7) 29(17) year为闰年 month=2时,29<day(8) 30(18) year为⾮闰年 month=2时,28<day(9) 31(19) month=1,3,5,7,8,10,12时,31<day(20) month=4,6,9,11时,30<day(21) day>31(22) 其他输⼊2)为有效等价类设计测试⽤例序号测试数据期望结果覆盖范围12016 2 29下⼀天是2016年3⽉1⽇!(1)(5)(7)22017 1 28下⼀天是2017年1⽉29⽇!(2)(3)(6)32017 1 31下⼀天是2017年2⽉1⽇!(2)(3)(9)42017 4 30下⼀天是2017年5⽉1⽇!(2)(4)(8)52017 12 31下⼀天是2018年1⽉1⽇!(2)(3)(9)3)为每⼀个⽆效等价类⾄少设计⼀个测试⽤例序号输⼊数据期望结果覆盖范围61899 3 1年的值不在指定范围之内(10)72051 3 1年的值不在指定范围之内(11)8205% 3 1⽆效的输⼊⽇期!(12)91901 -1 1⽉的值不在指定范围之内(13)101901 13 1⽉的值不在指定范围之内(14)111901 1% 1⽆效的输⼊⽇期!(15)121901 1 -1⽇的值不在指定范围之内(16)132016 2 30⽇的值不在指定范围之内(17)142017 2 29⽇的值不在指定范围之内(18)152017 3 32⽇的值不在指定范围之内(19)162017 4 31⽇的值不在指定范围之内(20)172017 4 32⽇的值不在指定范围之内(21)182017 4 3%⽆效的输⼊⽇期!(22)(2)编写nextDate函数,使⽤Junit4测试执⾏测试被测代码package io.shentuzhigang.demo.blackbox;import java.util.regex.Pattern;/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-05-06 15:43*/public class Date {private static final Pattern pattern = pile("^[-\\+]?[\\d]*$");public static String nextDate(String s_year, String s_month, String s_day) { //检测是否存在⽆效字符if (!(isInteger(s_year) && isInteger(s_month) && isInteger(s_day))) {return "⽆效的输⼊⽇期!";}//将字符串转为intint 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 ("年的值不在指定范围之内");} else if (month > 12 || month < 1) {return ("⽉的值不在指定范围之内");} else if (day > 31 || day < 1) {return ("⽇的值不在指定范围之内");}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;// day超过29}} else {//⾮闰年if (day == 28) {day = 1;month = 3;} else if (day < 28) {day = day + 1;} else {flag = true;}}}break;default:}if (year > 2050) {return ("年的值不在指定范围之内");} else if (flag) {return ("⽇的值不在指定范围之内");} else {return ("下⼀天是" + year + "年" + month + "⽉" + day + "⽇!"); }}/*** 判断输⼊字符串是否是整数型** @param str* @return*/public static boolean isInteger(String str) {return pattern.matcher(str).matches();}}测试代码package io.shentuzhigang.demo.blackbox;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;import java.util.Arrays;import java.util.Collection;/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-05-06 15:43*/@RunWith(Parameterized.class)public class DateTests {private String input1;private String input2;private String input3;private String expected;@Parameterspublic static Collection<?> prepareData(){String [][] object = {// 有效等价类{"2016","2","29","下⼀天是2016年3⽉1⽇!"},{"2017","1","28","下⼀天是2017年1⽉29⽇!"},{"2017","1","31","下⼀天是2017年2⽉1⽇!"},{"2017","4","30","下⼀天是2017年5⽉1⽇!"},// ⽆效等价类{"1899","3","1","年的值不在指定范围之内"},{"2051","3","1","年的值不在指定范围之内"},{"205%","3","1","⽆效的输⼊⽇期!"},{"1901","-1","1","⽉的值不在指定范围之内"},{"1901","13","1","⽉的值不在指定范围之内"},{"1901","1%","1","⽆效的输⼊⽇期!"},{"1901","1","-1","⽇的值不在指定范围之内"},{"2016","2","30","⽇的值不在指定范围之内"},{"2017","2","29","⽇的值不在指定范围之内"},{"2017","3","32","⽇的值不在指定范围之内"},{"2017","4","31","⽇的值不在指定范围之内"},{"2017","4","32","⽇的值不在指定范围之内"},{"2017","4","3%","⽆效的输⼊⽇期!"}};return Arrays.asList(object);}public DateTests(String input1,String input2,String input3,String expected){this.input1 = input1;this.input2 = input2;this.input3 = input3;this.expected = expected;}@Testpublic void testDate(){String result = Date.nextDate(input1,input2,input3);Assert.assertEquals(expected,result);}}测试结果五、缺陷分析1.⽤例?发⽣故障的原因是程序先判断day为29就变为3⽉1⽇,⽽不先判断是否为闰年,于是⽤例?的输出结果为2007-3-1⽽不是⽆效输⼊⽇期。
1、使用等价类划分法为NextDate函数设计测试用例:
NextDate函数包含三个输入变量month、day和year(要求month、day和year 均为整数值,并且满足:1≤month≤12; 1≤day≤31;1912≤year≤2050),函数的输出为输入日期后一天的日期。
(1)列出输入域等价类表(包括有效和无效等价类)。
(2)根据(1)中的等价类,设计能覆盖所有等价类的测试用例,要求包括输入数据和预期输出,并指出各个测试用例所覆盖的等价类编号。
2、某城市电话号码由三部分组成,分别是:
地区码——空白或者三位数字;
前缀——非‘0’或‘1’开头的三位数字;
后缀——4位数字。
假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的电话号码。
(1)列出输入域等价类表(包括有效和无效等价类)。
(2)根据(1)中的等价类表,设计能覆盖所有等价类的测试用例,要求包括输入数据和预期输出,并指出各个测试用例覆盖的等价类编号。
3、使用基本路径测试方法测试以下程序段:
V oid sort(int irecordnum,int itype)
1{
2Int x = 0;
3Int y = 0;
4While( irecordnum -- >0 )
5{
6If( itype == 0)
7Break;
8Else
9If(itype == 1)
10x = x+10;
11Else
12y = y+20;
13}
14}
说明:写在程序段某些行开头数字(1~14)是对每条语句的编号。
(1)画出程序的控制流程图(用题中给出的语句编号表示)。
(2)计算上述程序段的环形复杂度。
(3)导出基本路径集,列出程序的独立路径(用题中给出的语句编号表示)。
请根据(3)中的独立路径,设计测试用例的输入数据和预期输出。
4、使用基本路径测试方法测试以下程序段:
Int IsGood( int grade )
{
① If (grade <= 100)
{
② If( grade >= 80 )
{
③ If(year >= 90 )
④ Result = 2; //优秀
Else
⑤ Result = 1; //良好
}
Else if(grade >= 0)
⑥ Result = 0; //合格
Else
⑦ Result = -1; //分数为负数
}
Else
⑦ Result = -1; //分数大于100
⑧ Return Result;
}
说明:写在程序段某些行开头数字(①~⑧)是对应语句的编号。
(4)画出程序的控制流程图(用题中给出的语句编号表示)。
(5)计算上述程序段的环形复杂度。
(6)导出基本路径集,列出程序的独立路径(用题中给出的语句编号表示)。
(7)假设输入的取值范围是 0 <= grade <= 100,请根据(3)中的独立路径,设计测试用例的输入数据和预期输出。