题目要求
测试以下程序:该程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12、1≤day≤31和1900≤year≤2050),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期。例如,输入为2004年11月30日,则该程序的输出为2004年12月1日。
- 划分等价类,按照等价类划分法设计测试用例;
- 编写getNextDate函数;
- 掌握Junit4的用法,使用Junit4测试getNextDate函数。
等价类表
假设输入格式为year,month,day,且三个输入变量year、month和day均被输入。
year要区分闰年和平年,其中闰年还可以分为世纪闰年和普通闰年,且year要属于[1900,2050]。
month要根据该月有几天来进行区分,并且需要考虑是否向year进位,且month要属于[1,12]。
day要根据月份来判断天数是否合法,并且需要考虑是否向month进位,且day要属于[1,31]。
等价类划分如下。
测试用例
有效等价类测试用例
共有5个有效等价类测试用例。
测试数据 | 期望结果 | 覆盖范围 |
---|---|---|
2004/12/25 | 2004/12/26 | 2,10,14 |
2001/2/28 | 2001/3/1 | 3,7,15 |
2000/2/29 | 2000/3/1 | 1,7,16 |
2001/4/30 | 2001/5/1 | 3,8,17 |
2001/5/31 | 2001/6/1 | 3,9,18 |
无效等价类测试用例
共有12个有效等价类测试用例。
测试数据 | 期望结果 | 覆盖范围 |
---|---|---|
1899/6/1 | year非法 | 4 |
2051/6/1 | year非法 | 5 |
a/6/1 | year非法 | 6 |
1999/0/1 | month非法 | 11 |
1999/13/1 | month非法 | 12 |
1999/a/1 | month非法 | 13 |
1999/1/0 | day非法 | 19 |
1999/1/32 | day非法 | 20 |
1999/1/a | day非法 | 21 |
2001/2/29 | day非法 | 22 |
2000/2/30 | day非法 | 23 |
2001/4/31 | day非法 | 24 |
源代码
项目结构如下图所示
DateUtil.java
1 | package com.company; |
DateUtilTest.java
1 | package com.test; |
测试结果
如下图所示,17个测试用例均测试成功,程序实际输出与期望值相同。
实验总结
本次实验的主要目的是巩固黑盒测试方法中的等价类划分法的知识,练习JUnit的参数化测试。在本次实验中,我认为我的getNextDate函数的实现并不是很优雅,比较过程化。写这个函数花了我很多时间,主要问题在于我没有抓住一些关键的、抽象的逻辑和子函数,比如天向月份进位和月份向年份完全可以参照加法器的循环、可以写一个函数根据年份和月份判断出天数的最大值等等。
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!