黑盒测试:NextDate的判定表驱动法及测试用例设计

程序有三个输入变量monthdayyearmonthdayyear均为整数值,并且满足:1≤month≤121≤day≤311900≤ year ≤2050。),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。例如,输入为20051129日,则该程序的输出为20051130日。

(1)根据题目要求使用判定表驱动法设计测试用例

第一步:分析题目

输入变量:年份(year)、月份(month)、日期(day),输入变量的取值范围,输入变量的取值范围为:1900year20501month121day31

本题目的可能执行的操作为:

1)无效日期;

2day+1

3day=1

4month+1

5month=1

6year+1

第二步:分析有效等价类

1month变量的有效等价类

         M1{monthmonth=46911}

         M2{monthmonth=1357810}

         M3{monthmonth=12}

         M4{monthmonth=2}

2day变量的有效等价类

         D1{day1≤day≤27}

         D2{dayday=28 }

         D3{dayday =29}

         D4{dayday =30}

         D5{dayday =31}

3year变量的有效等价类

         Y1:{year:year是1900到2050年之间的闰年};

         Y2:{year:year不是1900到2050年之间的闰年};

第三步:创建判定表

根据条件桩三个变量的有效等价类的各种可能组合生成判定表:

第四步:化简判定表

根据所创建的初始判定表去化简,生成化简后的判定表:

 

第五步:设计测试用例

根据化简后的判定表设计出相应的测试用例:

(2)编写NextDate函数,使用Junit4测试执行测试

1)被测代码

package com.example.experiment3;

/**
 Created by IntelliJ IDEA.
 User: Starfall
 Date: 2022/10/26 0026
 Time: 20:32
 */

public class NextDate {
    //获得某年中的某个月份的总天数
    private static int getDays(int year, int month) {
        if (month == 2) {
            return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 29 : 28;
        } else {
            return (month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31;
        }
    }

    //输入参数为年、月、日三个字符串,输出结果为 "YYYY-MM-DD" 格式的下一天日期或 "输入无效" 字符串
    public static String nextDate(String yearStr, String monthStr, String dayStr){
        //判断三个输入值是否存在空值
        if (yearStr == null || monthStr == null || dayStr == null
                || yearStr.trim().equals("") || monthStr.trim().equals("") || dayStr.trim().equals("")) {
            return "输入无效";
        } else {
            yearStr = yearStr.trim();
            monthStr = monthStr.trim();
            dayStr = dayStr.trim();
        }

        //判断是否含有非数字字符
        int year, month, day;
        try {
            year = Integer.parseInt(yearStr);
            month = Integer.parseInt(monthStr);
            day = Integer.parseInt(dayStr);
        } catch (Exception e) {
            return "输入无效";
        }

        //判断各个输入值是否在合法的范围内
        if (year < 1900 || year > 2050) {
            return "输入无效";
        }
        if (month < 1 || month > 12) {
            return "输入无效";
        }
        if (day < 1 || day > getDays(year, month)) {
            return "输入无效";
        }

        //日期向后加一天,然后返回
        day = day + 1;
        if (day > getDays(year, month)) {
            day = 1;
            month = month + 1;
            if (month > 12) {
                month = 1;
                year = year + 1;
            }
        }
        return year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day);
    }
}

2)测试类

package com.example.experiment3;
import org.junit.Assert;
import org.junit.Test;

/**
 Created by IntelliJ IDEA.
 User: Starfall
 Date: 2022/10/26 0026
 Time: 20:32
 */

public class NextDateTest {
    @Test
    public void testDate01() {
        String NextDay=NextDate.nextDate("2022","6","27");
        String result = NextDay.toString();
        Assert.assertEquals("2022-06-28", result);
    }

    @Test
    public void testDate02() {
        String NextDay=NextDate.nextDate("2022","4","30");
        String result = NextDay.toString();
        Assert.assertEquals("2022-05-01", result);
    }

    @Test
    public void testDate03() {
        String NextDay=NextDate.nextDate("2022","11","31");
        String result = NextDay.toString();
        Assert.assertEquals("输入无效", result);
    }

    @Test
    public void testDate04() {
        String NextDay=NextDate.nextDate("2022","10","27");
        String result = NextDay.toString();
        Assert.assertEquals("2022-10-28", result);
    }

    @Test
    public void testDate05() {
        String NextDay=NextDate.nextDate("2022","10","31");
        String result = NextDay.toString();
        Assert.assertEquals("2022-11-01", result);
    }

    @Test
    public void testDate06() {
        String NextDay=NextDate.nextDate("2022","12","30");
        String result = NextDay.toString();
        Assert.assertEquals("2022-12-31", result);
    }

    @Test
    public void testDate07() {
        String NextDay=NextDate.nextDate("2049","12","31");
        String result = NextDay.toString();
        Assert.assertEquals("2050-01-01", result);
    }

    @Test
    public void testDate08() {
        String NextDay=NextDate.nextDate("2020","2","1");
        String result = NextDay.toString();
        Assert.assertEquals("2020-02-02", result);
    }

    @Test
    public void testDate09() {
        String NextDay=NextDate.nextDate("2008","2","29");
        String result = NextDay.toString();
        Assert.assertEquals("2008-03-01", result);
    }

    @Test
    public void testDate10() {
        String NextDay=NextDate.nextDate("2008","2","31");
        String result = NextDay.toString();
        Assert.assertEquals("输入无效", result);
    }

    @Test
    public void testDate11() {
        String NextDay=NextDate.nextDate("2018","2","14");
        String result = NextDay.toString();
        Assert.assertEquals("2018-02-15", result);
    }

    @Test
    public void testDate12() {
        String NextDay=NextDate.nextDate("2018","2","28");
        String result = NextDay.toString();
        Assert.assertEquals("2018-03-01", result);
    }

    @Test
    public void testDate13() {
        String NextDay=NextDate.nextDate("2018","2","29");
        String result = NextDay.toString();
        Assert.assertEquals("输入无效", result);
    }
}

3)测试结果

(1)运行测试

(2)覆盖测试

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐