计算某天的下一天:黑盒测试之等价类划分+JUnit参数化测试
2020-04-28 03:14
302 查看
# 题目要求
测试以下程序:该程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12、1≤day≤31和1900≤year≤2050),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期。例如,输入为2004年11月30日,则该程序的输出为2004年12月1日。
1. 划分等价类,按照等价类划分法设计测试用例;
2. 编写getNextDate函数;
3. 掌握Junit4的用法,使用Junit4测试getNextDate函数。
# 等价类表
假设输入格式为year,month,day,且三个输入变量year、month和day均被输入,等价类划分如下。
![等价类划分表.jpg](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200427190527等价类划分表.jpg)
**按照题意则确实按上表这样划分等价类;按照实际情况则应考虑2月的特殊性。在本次实验中,我按照题意划分等价类;考虑到2月的特殊性,在根据有效等价类和无效等价类设计测试用例之外,我额外设计了4个测试用例**。
# 测试用例
## 有效等价类测试用例
| **测试数据** | **期望结果** | **覆盖范围** |
| :----------: | :----------: | :----------: |
| 2004/11/30 | 2004/12/1 | 1,5,9 |
## 无效等价类测试用例
| **测试数据** | **期望结果** | **覆盖范围** |
| :----------: | :----------: | :----------: |
| 1899/6/1 | year非法 | 2 |
| 2051/6/1 | year非法 | 3 |
| a/6/1 | year非法 | 4 |
| 1999/0/1 | month非法 | 6 |
| 1999/13/1 | month非法 | 7 |
| 1999/a/1 | month非法 | 8 |
| 1999/1/0 | day非法 | 10 |
| 1999/1/32 | day非法 | 11 |
| 1999/1/a | day非法 | 12 |
## 针对2月设计的等价类测试用例
因为闰年的2月有29天、非闰年的2月有28天,所以题目中对于year、month和day三个变量的要求不够严谨,所以再设计4个用例。
| **测试数据** | **期望结果** | **覆盖范围** |
| :----------: | :----------: | :-----------: |
| 2000/2/30 | day非法 | 闰年day非法 |
| 2000/2/29 | 2000/3/1 | 闰年day合法 |
| 1999/2/29 | day非法 | 非闰年day非法 |
| 1999/2/28 | 1999/3/1 | 非闰年day合法 |
## 其它测试用例
上文中的等价类测试用例其实只测试了输入是否合法,而并未关注程序的功能是否实现。因此可以从功能角度出发设计测试用例,举例如下。
| **测试数据** | **期望结果** | **覆盖范围** |
| :----------: | :----------: | :----------------------------: |
| 2000/12/31 | 2001/1/1 | 31天的月份,month进位,day进位 |
| …… | …… | …… |
# 源代码
项目结构如下图所示
![项目结构.jpg](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200427190552%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84.jpg)
## DateUtil.java
```java
package com.company;
public class DateUtil {
// 有31天的月份
private static int[] monthOfThirtyOne = new int[]{1,3,5,7,8,10,12};
// 有30天的月份
private static int[] monthOfThirty = new int[]{4,6,9,11};
// 年月日
private int year;
private int month;
private int day;
// 最终实现的功能,输入是一个“年/月/日”格式的字符串;
// 如果函数运行成功,输出则是相同格式的下一天,否则是错误信息
public String getNextDate(String dateStr){
String updateResult = this.updateDate(dateStr);
// 如果输入合法
if (updateResult.equals("success")){
String checkResult = this.checkDate();
// 如果输入合法
if (checkResult.equals("valid")){
// 计算明天的日期
return this.calcNextDate();
}
return checkResult;
}
return updateResult;
}
// 根据输入字符串转换并更新年月日
private String updateDate(String dateStr){
// 获取年月日
String[] numbers = dateStr.split("/");
try{
this.year = Integer.parseInt(numbers[0]);
}catch (NumberFormatException e){
return "year非法";
}
try{
this.month = Integer.parseInt(numbers[1]);
}catch (NumberFormatException e){
return "month非法";
}
try{
this.day = Integer.parseInt(numbers[2]);
}catch (NumberFormatException e){
return "day非法";
}
return "success";
}
// 检查日期是否合法
private String checkDate(){
String valid = "valid";
String yearInvalid = "year非法";
String monthInvalid = "month非法";
String dayInvalid = "day非法";
// year合法
if (year>=1900&&year=1&&month
相关文章推荐
- 黑盒之测试用例设计策略
- 黑盒和白盒测试
- (翻译)测试小技巧集锦之一黑盒测试
- 黑盒测试之错误输入
- 使用console进行 性能测试 和 计算代码运行时间(转载)
- 黑盒测试实践--Day2 11.26
- 实践作业2:黑盒测试实践(小组作业)每日任务记录6
- 黑盒测试用例设计案例
- 译文:性能测试容量计算方法
- 黑盒测试用例设计方法
- 黑盒测试设计方法:流程分析法回顾
- 【tool】如何提高黑盒测试用例的覆盖度思路
- 转:黑盒测试用例设计方法
- 软件测试的两个方面黑盒和白盒
- 黑盒测试设计方法-判定表法回顾(上)
- 黑盒测试方法
- 软件测试缺陷密度的计算方法
- 高性能计算集群测试技术-什么样的系统适合您?
- 【从黑盒到灰盒】如何测试上限值?
- c# 计算程序执行时间,计算一段代码执行所用的时间,测试效率