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.Test
org.junit.Before
org.junit.After
org.junit.BeforeClass
org.junit.AfterClass
org.junit.Ignore
org.junit.runner.RunWith
org.junit.runners.Suite.SuiteClasses
org.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)为有效等价类设计测试用例

序号 测试数据 期望结果 覆盖范围
1 2016 2 29 下一天是2016年3月1日! (1)(5)(7)
2 2017 1 28 下一天是2017年1月29日! (2)(3)(6)
3 2017 1 31 下一天是2017年2月1日! (2)(3)(9)
4 2017 4 30 下一天是2017年5月1日! (2)(4)(8)
5 2017 12 31 下一天是2018年1月1日! (2)(3)(9)

3)为每一个无效等价类至少设计一个测试用例

序号 输入数据 期望结果 覆盖范围
6 1899 3 1 年的值不在指定范围之内 (10)
7 2051 3 1 年的值不在指定范围之内 (11)
8 205% 3 1 无效的输入日期! (12)
9 1901 -1 1 月的值不在指定范围之内 (13)
10 1901 13 1 月的值不在指定范围之内 (14)
11 1901 1% 1 无效的输入日期! (15)
12 1901 1 -1 日的值不在指定范围之内 (16)
13 2016 2 30 日的值不在指定范围之内 (17)
14 2017 2 29 日的值不在指定范围之内 (18)
15 2017 3 32 日的值不在指定范围之内 (19)
16 2017 4 31 日的值不在指定范围之内 (20)
17 2017 4 32 日的值不在指定范围之内 (21)
18 2017 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 = Pattern.compile("^[-\\+]?[\\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 "无效的输入日期!";
        }
        //将字符串转为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 ("年的值不在指定范围之内");
        } 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;

    @Parameters
    public 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;

    }
    @Test
    public void testDate(){
        String result = Date.nextDate(input1,input2,input3);
        Assert.assertEquals(expected,result);
    }
}

测试结果

五、缺陷分析

1.用例?发生故障的原因是程序先判断day为29就变为3月1日,而不先判断是否为闰年,于是用例?的输出结果为2007-3-1而不是无效输入日期。

2.用例?发生故障的原因是程序没有先判断接收的三个参数是否在指定范围内,而是先根据month进行数据处理,再判断处理后的参数是否在指定范围内,用例?的参数因为month为3所以直接day+1由0变成1再判断day在指定范围内,所以用例?的输出结果为1998-3-1而不是日的值不在指定范围内。

到此这篇关于Java黑盒测试之nextDate函数测试的文章就介绍到这了,更多相关Java nextDate函数测试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaWeb实战之编写单元测试类测试数据库操作

    首先导入jar包 使用Mybatis generator生成,dao.entity.mappers 没有dataSource,我圈错了... jdbc.properties是数据库链接配置文件 sqlMapConfig.xml是Mybatis 配置文件 如何自动生成这些文件夹? 如下.右键generatorConfig -> 选择Run as -> 如何点击Run Mybatis Generator 新建MyBatisTool public class MybatisTool { public

  • Java Unsafe类实现原理及测试代码

    Unsafe类介绍 第一次看到这个类时被它的名字吓到了,居然还有一个类自名Unsafe?读完本文,大家也能发现Unsafe类确实有点不那么安全,它能实现一些不那么常见的功能. Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题.过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有.Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了. Unsafe类提供了以下这些功能: 一.内存管理.

  • Java调用WebService接口作测试

    1.选择一个WebService接口作测试 假设 WebService url 为 http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx(查询手机归属地) 通过网页看到接口有两个,也可看到参数以及返回值 该接口来源于 http://www.webxml.com.cn/zh_cn/web_services.aspx (WebService接口大全) 选择该手机号查询归属地,是由于简单,其他接口都复杂一点,老是出现解析组件 's:schema'

  • Java程序测试上传Maven工程代码示例解析

    创建普通Maven工程 导入所需依赖坐标: <dependencies> <!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java --> <dependency> <groupId>net.oschina.zcx7878</groupId> <artifactId>fastdfs-client-java</artifactId

  • java测试框架的方法

    项目开发过程中使用的单元测试框架有Junit.TestNG以及Mockito,Junit和TestNG使用的比较多,Mockito最近才开始使用. TestNG与JUnit的相同点 1. 使用annotation,且大部分annotation相同. 2. 都可以进行单元测试(Unit test). 3. 都是针对Java测试的工具. TestNG与JUnit的不同点: 1. JUnit只能进行单元测试,TestNG可以进行单元测试,功能测试,端到端测试,集成测试等. 2. TestNG需要一个额

  • Java高并发测试框架JCStress详解

    前言 如果要研究高并发,一般会借助高并发工具来进行测试.JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JVM,类库以及硬件等状况. JCStress学起来很简单,而且官方也提供了许多高并发场景下的测试用例,只要引入一个jar包,即可运行研究. 如何使用JCStress 此演示用maven工程,首先需要引入jar包,核心包是必须要的,样例包非必须要,此是为了演示其中的例子. <dependencies>

  • Java Testcontainers库实现测试功能

    1.Testcontainers介绍: Testcontainers是一个Java库,它支持JUnit测试,提供公共数据库.SeleniumWeb浏览器或任何可以在Docker容器中运行的轻量级.一次性实例. 测试容器使以下类型的测试更加容易: 数据访问层集成测试: 使用MySQL,PostgreSQL或Oracle数据库的容器化实例测试您的数据访问层代码,但无需在开发人员的计算机上进行复杂的设置,并且测试将始终从已知的数据库状态开始,避免"垃圾"数据的干扰.也可以使用任何其他可以容器

  • Java进行Appium自动化测试的实现

    本文介绍如何在eclipse中使用Java进行Appium自动化测试 前提条件 1.配置好了java环境 2.安装了eclipse 3.安装了Maven 4.安装了Android模拟器.我用的夜神模拟器,下载地址:https://www.yeshen.com/ 5.能够正常连接Android模拟器 (1)模拟器进入开发者模式 在模拟器中,点击 设置->关于平板电脑->版本号(多次点击) (2)检查adb版本 cmd中输入 adb version查看Android SDK的adb版本 进入夜神模

  • 分享我的第一次java Selenium自动化测试框架开发过程

    由于公司的开发团队偏向于使用Java技术,而且公司倡导学习开源技术,所以我选择用Java语言来进行Selenium WebDriver的自动化框架开发.由于本人没有Java开发经验,以前虽然学过QTP但从没有接触过Selenium,正好通过这个机会能学习一下自动化测试,同时也学习一下基本的Java开发过程. 一.首先是搭建框架开发环境 按照网上的方法部署eclipse,建立TestAction工程,并Import引用JDK和Selenium-2.44完整包 二.继续引用和安装相关jar包 1.首

  • 黑盒测试 白盒测试 原理分析

    1.黑盒测试(Black-box Tesing) 黑盒测试又称功能测试.数据驱动测试或基于规格说明书的测试.注重于测试软件的功能性需求. 采用这种测试方法,测试者把被测程序看成一个黑盒子,完全不要考虑程序的内部结构和特性,只知道该程序输入和输出之间的关系或程序功能,依靠能够反映这一关系和程序功能的需求规格说明书,来自确定测试用例和推断测试结果的正确性.例如:Windows计算其程序,我们如果输入3.14159并按sqrt键,就会得到结果1.772453102341.使用黑盒子测试方式,不管软件计

  • Java基于Javafaker生成测试数据

    1. 前言 老板说,明天甲方要来看产品,你得造点数据,而且数据必须是"真"的,演示效果要好看一些,这样他才会买我们的产品,我好明年给你换个嫂子.一般开发接到这种过分要求都不会很乐意去做,这完全是体力劳动,而且很棘手.今天胖哥教你一招,让你做出逼真的"假"数据. 2. javafaker 我们Java是有可以生成仿真数据的框架的,这里我安利一个Javafaker的框架,你只需要在项目中引入: <dependency> <groupId>com.

随机推荐