nextdate函数
软件测试-NextDate函数
边界值分析法
输入 测试用例 month Test Case 1 Test Case 2 Test Case 3 Test Case 4 Test Case 5 Test Case 6 Test Case 7 Test Case 8 Test Case 9 Test Case 10 Test Case 11 Test Case 12 Test Case 13 Test Case 14 Test Case 15 Test Case 16 Test Case 17 Test Case 18 Test Case 19 Test Case 20 -1 0 1 2 11 12 13 6 6 6 6 6 6 6 6 6 6 6 6 6 day 15 15 15 15 15 15 15 -1 0 1 2 30 31 32 15 15 15 15 15 15 year 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 1911 1912 1913 2049 2050 2051 month不在1~12中 month不在1~12中 2000年1月16日 2000年2月16日 2000年11月16日 2000年12月16日 month不在1~12中 day不在1~31中 day不在1~31中 2000年6月2日 2000年6月3日 2000年7月1日 不可能的输入日期 day不在1~31中 year不在1912~2050中 1912年6月16日 1913年6月16日 2049年6月16日 2050年6月16日 year不在1912~2050中 期望输出
返回
Test Case 5
Test Case 6 Test Case 7 Test Case 8
Next_day()函数的用法
Next_day()函数的⽤法⼀、定义NEXT_DAY(date,char)date参数为⽇期型,char:为1~7或Monday/Mon~Sunday/指定时间的下⼀个星期⼏(由char指定)所在的⽇期,char也可⽤1~7替代,1表⽰星期⽇,2代表星期⼀。
还可以是星期⼀、星期⼆。
星期⽇,即 monday,thusday.....(看是什么字符集的)格式:NEXT_DAY(DATE,WEEKDAY) 即 NEXT_DAY(⽇期,星期⼏)NEXT_DAT函数返回输⼊⽇期开始,紧随其后的指定星期对应的⽇期,weekday可以⽤全称,也可以⽤缩写(如'monday','tuesday','wed')例:next_day(to_date('1999.11.24','yyyy.mm.dd'),'friday') 返回 1999年11⽉26⽇例:next_day(to_date('1999.11.24','yyyy.mm.dd'),'wed') 返回 1999年11⽉01⽇注:1999年11⽉24⽇是星期三,第⼆个参数是星期五,是两天后。
第⼆个例⼦由于⽇期正好是星期三,只能⽤下⼀个星期三⽇期。
⼆、⽤法1、select next_day(sysdate,1) from dual;或者select NEXT_DAY (sysdate, 'MONDAY ') FROM DUAL;求当前系统时间的下⼀星期⼀的时间,若报错现实“周中的⽇⽆效”,是因为字符集的问题,说明你的oracle的字符集是简体中⽂的,即:simplified chinese的可以设置字符集alter session set NLS_DATE_LANGUAGE = American; 将当前对话改为英⽂。
软件测试NextDate函数测试用例详解
15
2007
2007年12月16日
Test Case 15
12
31
2007
2008年1月1日
Test Case 16
2
15
2007
2007年2月16日
Test Case 17
2
28
2000
2000年2月29日
Test Case 18
2
28
2007
2007年3月1日
Test Case 19
2
29
动作:
A1: 不可能
√
√
√
A2: day加1
√
√
√
√
√
A3: day复位
√
√
√
A4: month加1
√
√
A5: month复位
√
A6:year加1
√
决策表法
表5-8 简化的NextDate函数决策表
选项 规则
1, 2, 3
4
5
6, 7, 8, 9
10
11, 12, 13, 14
15
等价类划分法——以输入域划分等价类
等价类划分法——以输入域划分等价类
改进等价类划分测试NextDate函数如表5-5所示。 表5-5 改进等价类划分法测试用例
测试用例
输入
期望输出
month
day
year
Test Case 1
6
30
2007
2007年7月1日
Test Case 2
8
31
2007
2007年9月1日
弱强健等价类测试 弱强健等价类测试中的有效测试用例使用每个有效等价类中的一个值。弱强健等价类测试中的无效测试用例那么只包含一个无效值,其他都是有效值,即含有单缺陷假设。如表5-3所示。
NextDate函数黑盒测试设计测试用例
N e x t D a t e函数黑盒测试设计测试用例(总4页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--实验一 NextDate函数一、实验目的使用合适的黑盒测试的测试用例设计方法为NextDate函数设计测试用例。
二、实验准备掌握软件测试的内容,熟悉了解常用的黑盒测试的测试用例设计方法,明确不同方法的区别,上网查找其他软件测试的方法。
三、实验性质本实验为设计性实验。
四、实验内容根据实验的目的和我所掌握的黑盒测试的测试用例设计方法,最后我选择用决策表测试法完成了对NextDate函数测试用例的设计。
设计如下:(1)month、day、year的有效等价类:M1:{month:month有30天}M2:{month:month有31天,12月除外}M3:{month:month是12月}M4:{month:month是2月}D1:{day:1≤da y≤27}D2:{day:day=28}D3:{day:day=29}D4:{day:day=30}D5:{day:day=31}Y1:{year:year是闰年} Y2:{year:year不是闰年}(2)根据各种有效的输入情况,程序中可能采取的操作有以下六种:a1:不可能 a2:day加1 a3:day复位a4:month加1 a5:month复位 a6:year加1(3)NextDate函数的决策表表4-1 NextDate函数的决策表(4)简化后的NextDate函数的决策表表4-2简化后的NextDate函数的决策表(5)根据简化后的决策表设计的测试用例表4-3测试用例表。
Nextdate 函数的黑盒测试
实验四 Nextdate 函数的黑盒测试一、实验目的:掌握黑盒测试中的决策表测试法,并对被测程序设计测试用例。
二、实验环境操作系统:Windows XP + SP2 /win7三、实验内容1、编写一个NextDate函数。
2、掌握黑盒测试中的决策表测试法的基本步骤。
3、使用决策表法设计测试用例,对编写的函数实施测试,总结分析测试结果。
四、实验步骤1、编写一个NextDate函数,代码如下:#include <stdio.h>int chk(int y,int m,int d){if (d<1||d>31) {return 0;}else if (m<1||m>12) {return 0;}else if (y<1912||y>2500) {return 0;} return 1;}int isy(int y){return (y%4==0&&y%100||y%400);}int ilm(int m ){return (m==4||m==6||m==9||m==11);}int ihm(int m){return (m==1||m==3||m==5||m==7||m==8||m==10||m==12);}int main(int argc, char* argv[]){int year,month,day;printf("Year=");scanf("%d",&year);printf("Month=");scanf("%d",&month);printf("Day=");scanf("%d",&day);if (chk(year,month,day)) {if ((day==28&&month==2&&!isy(year))||(day==29&&month==2&&isy(year))) { day=1;month=3;}e lse if (day==30&&ilm(month)||day==31&&ihm(month)) {day=1;month++;}else day++;if (month>12) {month=1;++year;}printf("Next date:%d-%d-%d\n",year,month,day);}else printf("日期不合法");return 0;2、}根据黑盒测试的决策表法设计测试用例。
hive的next_day用法
hive的next_day用法Hive是一个基于Hadoop的数据仓库工具,它提供了一种类SQL的查询语言,使得用户可以方便地进行数据分析和处理。
在Hive中,next_day函数是一个非常有用的函数,它可以用来计算某个日期的下一个星期几的日期。
本文将详细介绍next_day函数的用法和实例。
一、next_day函数的语法next_day函数的语法如下:next_day(date, day_of_week)其中,date是一个日期类型的表达式,day_of_week是一个字符串类型的表达式,表示星期几。
day_of_week可以是以下字符串之一:- "MONDAY"- "TUESDAY"- "WEDNESDAY"- "THURSDAY"- "FRIDAY"- "SATURDAY"- "SUNDAY"next_day函数返回一个日期类型的值,表示date所在星期的day_of_week的日期。
如果date本身就是day_of_week,则返回date。
二、next_day函数的实例下面是一些使用next_day函数的实例。
1. 计算下一个星期一的日期假设今天是2022年8月10日,我们想要计算下一个星期一的日期,可以使用如下语句:SELECT next_day('2022-08-10', 'MONDAY');执行结果为:2022-08-15这是因为2022年8月15日是下一个星期一的日期。
2. 计算下一个星期五的日期假设今天是2022年8月10日,我们想要计算下一个星期五的日期,可以使用如下语句:SELECT next_day('2022-08-10', 'FRIDAY');执行结果为:2022-08-12这是因为2022年8月12日是下一个星期五的日期。
实验二 Nextdata实验白盒测试
分析
实验
分析
续
实验
分析
续
实验
分析
续
日
本次实验的收获、体会、经验、问题和教训:
关于白盒测试
测试规划基于产品的内部结构进行测试,检查内部操作是否按规定执行,软件各个部分功能是否得到充分使用,则这种测试方法称为白盒测试(White-box Testing)方法。
白盒测试又称为结构测试、逻辑驱动测试或基于程序的测试,一般用来分析程序的内部结构。
2001.11.30
F1、F3、T4、F5
beji
2001.12.1
2.利用路径覆盖分析NextDate函数
基本路径测试方法
(1)控制流图
图2-1 NextDate函数的控制流图
(2)环形复杂度
方法一:V(G)=5(封闭区域)+1=6
方法二:V(G)=16(边数)—12(节点)+2=6
方法三:V(G)=5(判定节点2、3、4、5、6)+1=6
(3)导出基本路径
根据上面的计算结果,可导出基本路径集,列出程序的独立路径,可得出程序段的的基本路径集中有6条独立路径,每条独立路径为一个独立的测试用例。路径如下。
路径1:1→2→3→10→12
路径2:1→2→3→5→9→12
路径3:1→2→3→5→6→7→12
路径4:1→2→3→5→6→8→12
路径5:1→2→4→5→6→8→12
输入条件
覆盖条件
执行路径
预期输出
测试用例1
2000.2.29
T1、T2
ac
2000.3.1
测试用例2
2001.2.28
F1、T3
bd
2001.3.1
NextData函数
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函数
2
15 9 9
30
9 35 9
Page 11
2007
2007 2007 2100
不可能的输入日期
变量month无效 变量day无效 变量year无效 制作者:
边界值分析法
边界值分析法设计测试用例
在NextDate函数中,规定了变量month、day、year的相应 取值范围。在上面等价类法设计测试用例中已经提过,具 体如下: M1={month:1≤month≤12} D1={day:1≤day≤31} Y1={year:1912≤year≤2050}
决策表共有22条规则: 第1~5条规则解决有30天的月份; 第6~10条规则解决有31天的月份(除12月份以外); 第11~15条规则解决12月份; 第16~22条规则解决2月份和闰年的问题。 不可能规则也在决策表中列出,比如第5条规则中在有30天的 月份中也考虑了31日。
制作者:
Page 16
决策表法
NextDate函数的用例设计方法
主讲:黄老师
授课班级:软件设计班
制作者:
NextDate函数的用例设计方法
黑盒测试
等价类划分法
边界值分析法
因果图法 决策表法
制作者:
Page 2
等价类划分法——以输入域划分等价类
NextDate 函数包含三个变量:month(月份)、day(日期) 和 year(年),函数的输出为输入日期后一天的日期。 例如, 输入为 2007年9月 9日,则函数的输出为 2007年9月10日 。 要求输入变量 month 、 day 和 year 均为整数值,并且满足 下列条件: (1)1≤month≤12 (2)1≤day≤31 (3)1912≤year≤2050 此函数的主要特点是输入变量之间的逻辑关系比较复杂。复杂 性的来源有两个:一个是输入域的复杂性,另一个是指闰年 的规则。例如变量year和变量month取不同的值,对应的变 量day会有不同的取值范围,day值的范围可能是1~30或1~ 31,也可能是1~28或1~29。
Java黑盒测试之nextDate函数测试
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⽽不是⽆效输⼊⽇期。
软件测试复习题_带答案
软件测试复习题一、判断(01)测试是为了验证软件已正确地实现了用户的要求。
错1、测试的目的是为了发现尽可能多的缺陷,不是为了说明软件中没有缺陷。
2、成功的测试在于发现了迄今尚未发现的缺陷。
所以测试人员的职责是设计这样的测试用例,它能有效地揭示潜伏在软件里的缺陷。
1.验证软件实现与需求的一致性2.找出BUG3.了解和评估软件当前的质量风险4.缺陷预防1)从用户角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,已考虑是否可以接受产品。
(2)从软件开发者出发,则希望软件测试成为表明软件产品不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。
(02)白盒测试仅与程序的内部结构有关,完全可以不考虑程序的功能要求。
对(03)白盒测试不仅与程序的内部结构有关,还要考虑程序的功能要求。
错(04)黑盒测试的测试用例是根据程序内部逻辑设计的。
错(05)黑盒测试的测试用例是根据应用程序的功能需求设计的。
对(06)为了快速完成集成测试,采用一次性集成方式是适宜的。
错(07)在软件开发过程中,若能推迟暴露其中的错误,则为修复和改进错误所花费的代价就会降低。
错(05)在软件开发过程中,若能尽早暴露其中的错误,则为修复和改进错误所花费的代价就会降低。
对(09)单元测试通常由开发人员进行。
对(10)压力测试通常需要辅助工具的支持。
对(11)压力测试不需要辅助工具的支持。
错(12)测试人员说:“没有可运行的程序,我无法进行测试工作”。
错(13)软件测试员可以对产品说明书进行白盒测试。
错(14)软件测试员无法对产品说明书进行白盒测试。
对(15)在设计测试用例时,应包括合理的输入条件和不合理的输入条件。
对二、选择1、用黑盒技术设计测试用例的方法之一为( a )A)因果图B)逻辑覆盖C)循环覆盖D)基本路径测试T168技术文章】黑盒测试的测试用例设计方法·等价类划分方法·边界值分析方法·错误推测方法·因果图方法·判定表驱动分析方法·正交实验设计方法·功能图分析方法2、软件测试的目的是(b)A)避免软件开发中出现的错误B)发现软件开发中出现的错误C)尽可能发现并排除软件中潜藏的错误,提高软件的可靠性D)修改软件中出现的错误3、下列软件属性中,软件产品首要满足的应该是(a )A)功能需求B)性能需求C)可扩展性和灵活性D)容错纠错能力4、坚持在软件的各个阶段实施下列哪种质量保障措施,才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期(a)。
nextdate函数的代码
#include<>void main(){int year,month,day;void nextdate(int ,int ,int );printf("请输入年份(范围在1912-2050之间):");scanf("%d",&year);printf("请输入月份(范围在1-12之间):");scanf("%d",&month);printf("请输入日期(范围在1-31之间):");scanf("%d",&day);printf("%d年%d月%d日的下一天是:",year,month,day);nextdate(year,month,day);}void nextdate(int year,int month,int day){int leap( int );switch(month){case 1:case 3:case 5:case 7:case 8:case 10:if(day>=1&&day<31)day=day+1;else if(day==31){day=1;month=month+1;}elseprintf("输入数据错误!\n");break;case 12:if(day>=1&&day<31)day=day+1;else if(day==31){day=1;month=1;year=year+1;}{printf("输入数据错误!\n");exit(0);}break;case 4:case 6:case 9:case 11:if(day>=1&&day<30)day=day+1;else if(day==30){day=1;month=month+1;}else{printf("输入数据错误!\n");exit(0);}break;case 2:if(day>=1&&day<28)day=day+1;else if(!leap(year)&&day==28){day=1;month=month+1;}else if(leap(year)&&day==28)day=day+1;else if(leap(year)&&day==29){day=1;month=month+1;}else{printf("输入数据错误!\n");exit(0);}}printf("%d年%d月%d日\n",year,month,day); }int leap(int yy){return (yy%400==0||(yy%4==0&&yy%100!=0)); }。
NextData函数
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函数,是因为它可以说明输入定义域中的依赖性问题,这使得这个例子成为基于决策表测试的一个完美例子,因为决策表可以突出这种依赖关系。
从前面对等价类测试的分析我们知道,等价类分析假设所有的变量都是独立的。
如果变量确实是独立的,则使用类的笛卡尔积是有意义的。
如果变量之间在输入定义域中存在逻辑依赖关系,则这些依赖关系在笛卡尔积中就会丢失(说抑制可能更确切)。
决策表格式通过使用“不可能动作”概念表示条件的不可能组合,使我们能够强调这种依赖关系。
下面将对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面向对象实现nextdate包是一个实现“输入3个参数:年(year)、月(month)、日(day),返回输入日期后面的那个日期”的面向对象程序。
该包由1个抽象类(CalendarUnit)、4个具体类(Date、Month、Year、Day)组成。
其UML图如下:下面是详细描述。
①CalendarUnit类职责:提供一个操作在子类中设置属性值;提供一个布尔操作,说明在子类中的属性是否可以增1。
package nextdate;public abstract class CalendarUnit {protected int currentPos;protected void setCurrentPos(int pCurrentPos){currentPos = pCurrentPos;}protected int getCurrentPos(){return currentPos;}protected abstract boolean increment();}②Date类职责:Date对象由Day、Month和Year 3个对象组成。
Date对象通过这三个对象的布尔增量方法增1。
如果Day和Month对象不能加1,则Date根据需要重新设置Day和Month;如果是一年的最后一天,则Year也要加1。
printDate操作通过Day、Month和Year对象中的get()成员函数,以mm/dd/yyyy格式输出日期。
package nextdate;public class Date {private Day d;private Month m;private Year y;public Date(int pMonth, int pDay, int pYear) {y = new Year(pYear);m = new Month(pMonth,y);d = new Day(pDay,m);}public void increment(){if(! d.increment()){if(! m.increment()){y.increment();m.setMonth(1,y);}d.setDay(1,m);}}public void printDate(){System.out.println(m.getMonth()+"/"+d.getDay()+"/"+y.getYear()); }}③Day类职责:Day对象有一个私有Month属性,用以决定Day取值是要加1还是复位。