实验二+061+陈小兰

被测代码地址:http://www.cnblogs.com/chenyp1996/p/6619103.html

一、实验目的

掌握基于覆盖理论与基本路径的基本白盒测试方法和实践

二、实验要求

运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。

三、实验内容

根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。

所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。

包括的内容有:

1) 被测原代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

/*NextDate函数问题
NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性
NextDate函数包含三个变量month、day和year,函数的输出为输入日期后一
天的日期。 要求输入变量month、day和year均为整数值,并且满足下列条件:
条件1 1≤ month ≤12 否则输出,月份超出范围
条件2 1≤ day ≤31 否则输出,日期超出范围
条件3 1912≤ year ≤2050 否则输出:年份超出范围
String nextdate(int m,int d,int y)
注意返回值是字符串。
程序要求:
1)先显示“请输入日期”
2)不满足条件1,返回:“月份超出范围”;不满足条件2,返回:“日期超出范围”;
不满足条件3,返回:“年份超出范围”;如果出现多个不满足,以最先出现不满足的
错误返回信息。3)条件均满足,则输出第二天的日期:格式“****年**月**日”(如果
输入2050年12月31日,则正常显示2051年1月1日*/
public class MyDate {
    public static String nextdate(int month, int day, int year) {
        if (month < 1 || month > 12)
            return "月份超出范围";
        if (day < 1 || day > 31)
            return "日期超出范围";
        if (year < 1912 || year > 2050)
            return "年份超出范围";
        SimpleDateFormat sFormat = new SimpleDateFormat("yyyyMMdd");
        sFormat.setLenient(false);
        try {
            Calendar c = Calendar.getInstance();
            c.setTime(sFormat.parse("" + year + String.format("%02d", month) + String.format("%02d", day)));
            c.add(Calendar.DATE, 1);
            return c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日";
        } catch (ParseException e) {
            return "日期不存在";
        }
    }

    public static void main(String[] args) {
        String input = "";
        int month, date, year;//优化效率
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.print("请输入日期");
            input = scan.nextLine().trim();
            String[] buf = input.split("[\\s+::,,/]");// 支持多种分割方式
            if (input.equals(""))//无输入
                continue;
            else if (input.equalsIgnoreCase("return"))// 改进退出方式
                break;
            else if (buf.length == 3) {
                try {
                    month = Integer.valueOf(buf[1]);
                    date = Integer.valueOf(buf[2]);
                    year = Integer.valueOf(buf[0]);
                    System.out.println(nextdate(month, date, year));
                } catch (NumberFormatException e) {
                    System.out.println("日期格式错误");
                }
            } else//长度不对
                System.out.println("日期格式错误");
        }
        System.out.println("谢谢使用,再见~");
        scan.close();
    }
}

2)依据覆盖技术,测试用例列表:

程序流图                                                                                         DD路径图

DD-路径(只压缩链路经)


程序图节点


DD-路径


22


A


23


B


24


C


25


D


26


E


27


F


28


G


31-34


H


35


I


36,37,38


J


39


M

(I)语句覆盖:

A-B-C-K

A-B-D-E-K

A-B-D-F-G-K

A-B-D-F-H-I-K

A-B-D-F-H-J-K

测试用例:


用例ID


输入值


执行路径


预期输出


1


2015 15 14


A-B-C-K


月份超出范围


2


2015 12 36


A-B-D-E-K


日期超出范围


3


1111 12 11


A-B-D-F-G-K


年份超出范围


4


2001 01 01


A-B-D-F-H-I-K


2001年1月2日


5


2001 02 29


A-B-D-F-H-J-K


日期不存在

II)分支覆盖(判断覆盖):

A-B-C-K

A-B-D-E-K

A-B-D-F-G-K

A-B-D-F-H-I-K

A-B-D-F-H-J-K

测试用例:


用例ID


输入值


执行路径


预期输出


1


2013 22 14


A-B-C-K


月份超出范围


2


2011 11 38


A-B-D-E-K


日期超出范围


3


2051 11 28


A-B-D-F-G-K


年份超出范围


4


2003 11 12


A-B-D-F-H-I-K


2003年11月13日


5


2005 06 31


A-B-D-F-H-J-K


日期不存在

(III)路径覆盖:

A-B-C-K

A-B-D-E-K

A-B-D-F-G-K

A-B-D-F-H-I-K

A-B-D-F-H-J-K

测试用例:


用例ID


输入值


执行路径


预期输出


1


1998 87 11


A-B-C-K


月份超出范围


2


2011 11 56


A-B-D-E-K


日期超出范围


3


1000 07 25


A-B-D-F-G-K


年份超出范围


4


2017 04 13


A-B-D-F-H-I-K


2017年04月14日


5


2000 04 31


A-B-D-F-H-J-K


日期不存在

(IV)条件覆盖:各个条件取真或假的可能至少执行一次


编号


m<1

||m>12


d<1||

d>31


y<1912||y>2051


覆盖路径


1


F


F


F


B-C-K


2


F


F


T


B-C-K


3


F


T


T


B-C-K


4


T


F


F


B-D-E-K


5


T


T


F


B-D-F-G-K


6


T


T


T


B-D-F-H


编号


c.add(Calendar.DATE, 1);


覆盖路径


7


T


H-I-K


8


F


H-J-K

测试用例:


用例ID


输入值


执行路径


覆盖条件


预期输出


1


2051 14 36


A-B-C-K


1


月份超出范围


2


2055 14 30


A-B-C-K


2


月份超出范围


3


2014 15 22


A-B-C-K


3


月份超出范围


4


1000 11 32


A-B-D-E-K


4


日期超出范围


5


1000 11 22


A-B-D-F-G-K


5


年份超出范围


6


2014 11 25


A-B-D-F-H-I-K


6,7


2014年11月26日


7


2000 02 28


A-B-D-F-H-I-K


6,7


2000年02月29日


8


2014 06 31


A-B-D-F-H-J-K


6,8


日期不存在

3)相应Junit测试脚本、执行结果

import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

public class MyDateText {

    MyDate date = new MyDate();

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void Test1() {

        assertEquals("月份超出范围",date.nextdate(15, 14, 2015));

     }
    @Test
    public void Test2() {

         assertEquals("日期超出范围",date.nextdate(12, 36, 2015));

     }
    @Test
    public void Test3() {

         assertEquals("年份超出范围",date.nextdate(12, 11,1111 ));

     }
    @Test
    public void Test4() {

        assertEquals("2001年1月2日",date.nextdate(01, 01,2001 ));

     }
    @Test
    public void Test5() {

         assertEquals("日期不存在",date.nextdate(2,29, 2001));  

     }@Test
    public void Test6() {

        assertEquals("月份超出范围",date.nextdate(22, 14, 2013));

     }
    @Test
    public void Test7() {

        assertEquals("日期超出范围",date.nextdate(11, 38, 2001));

     }
    @Test
    public void Test8() {

        assertEquals("年份超出范围",date.nextdate(11, 28, 2051));

     }
    @Test
    public void Test9() {

        assertEquals("2003年11月13日",date.nextdate(11, 12, 2003));

     }

    @Test
    public void Test10() {

        assertEquals("日期不存在",date.nextdate(06, 31, 2006));

     }
    @Test
    public void Test11() {

        assertEquals("月份超出范围",date.nextdate(87, 11, 1998));
     }
    @Test
    public void Test12() {

        assertEquals("日期超出范围",date.nextdate(11, 56, 2001));

     }
    @Test
    public void Test13() {

        assertEquals("年份超出范围",date.nextdate(07, 25, 1000));
     }
    @Test
    public void Test14() {

        assertEquals("2017年4月14日",date.nextdate(04, 13, 2017));

     }
    @Test
    public void Test15() {

        assertEquals("日期不存在",date.nextdate(04, 31, 2000));

     }
    @Test
    public void Test16() {

        assertEquals("月份超出范围",date.nextdate(14, 36, 2051));

     }
    @Test
    public void Test17() {

        assertEquals("月份超出范围",date.nextdate(14, 30, 2055));

     }
    @Test
    public void Test18() {

        assertEquals("月份超出范围",date.nextdate(15, 22, 2014));

     }
    @Test
    public void Test19() {

        assertEquals("日期超出范围",date.nextdate(11, 32, 1000));

     }
    @Test
    public void Test20() {

        assertEquals("年份超出范围",date.nextdate(11, 22, 1000));

     }
    @Test
    public void Test21(){

            assertEquals("2014年11月26日",date.nextdate(11,25,2014));

     }
    @Test
    public void Test22() {

        assertEquals("2000年2月29日",date.nextdate(02, 28, 2000));

     }
    @Test
    public void Test23() {

        assertEquals("日期不存在",date.nextdate(06, 31, 2014));

     }

}

4)给出测试参数化和打包测试的脚本,并生成执行结果

1. 参数化测试

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class NextDateParamTest {
    private int param1;
    private int param2;
    private int param3;
    private String result;

    MyDate date = new MyDate();

    @Parameters
    public static Collection data(){
        return Arrays.asList(new Object[][]{
            {15,14,2015,"月份超出范围"},
            {12,36,2015,"日期超出范围"},
            {12,11,1111,"年份超出范围"},
            {01,01,2001,"2001年1月2日"},
            {02,29,2001,"日期不存在"},

        });
    }

    public NextDateParamTest(int param1,int param2,int param3,String result){
        this.param1 = param1;
        this.param2 = param2;
        this.param3 = param3;
        this.result = result;
    }

    @Test
    public void testParam(){
        String rs = date.nextdate(param1, param2, param3);
        assertEquals(rs,result);
    }

}

2.打包测试

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses(
        {
            MyDateTest.class,
            NextDateParamTest.class,
        }
        )
public class AllMydateTest {

}

4、测试小结:

  • 测试找到的缺陷清单:未发现缺陷
  • 对源代码的修改建议:无
  • 测试总结与心得体会:通过此次的实验,我对于白盒测试有了进一步的理解,掌握了程序的控制流图及其路径图的画法,并对各种覆盖方法有了更深层次的理解。同时还了解到了Junit测试的好处,能够使测试代码与产品代码分离、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试等等,也学到了两种测试参数测试和打包测试,虽然没完全掌握但已经能够使用了。
时间: 2024-10-21 04:22:26

实验二+061+陈小兰的相关文章

第三次实验报告+061+陈小兰

一.实验目的 掌握黑盒测试用例设计方法 二.实验要求 (1)对被测程序进行黑盒测试用例设计 (2)运用等价类.边界值.决策表.状态图法等进行测试用例设计. (3)对手机上任意一款音乐软件进行黑盒测试实践.(作业若雷同,后上传者判定0分) 三.实验内容 1.对被测程序运用不同的测试技巧进行测试用例设计,并执行测试,撰写测试小结. 要求写出测试用例表.执行情况和测试小结. 2.对手机上任意一款音乐软件进行黑盒测试. 要求:1)使用思维导图 2)根据场景法.状态图法 设计测试用例. 3)附加题:如有可

实验二+001+陈定国

一.实验目的 掌握基于覆盖理论与基本路径的基本白盒测试方法和实践 二.实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结. 三.实验内容 1) 被测原代码 import java.util.Scanner; public class Triangle{ public static void main(String[] args) { while(true){ System.out.println("请输入三角形的三条边:");

实验二+063+陈彧

一.实验目的 掌握基于覆盖理论与基本路径的基本白盒测试方法和实践 二.实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结. 三.实验内容 根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本. 所有的覆盖的技术:语句覆盖.判定覆盖.条件覆盖.判定/条件覆盖.组合覆盖.路径覆盖,基本路径测试方法. 1) 被测原代码 package Test1; import java.io.IOException; imp

实验二+116+陈洁

测试帖连接:http://www.cnblogs.com/ZQ4162/p/6623033.html 一.实验目的 掌握基于覆盖理论与基本路径的基本白盒测试方法和实践 二.实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结. 三.实验内容 1) 被测原代码 1 public class Caculator { 2 public static float commission(int Headphone,int Shell,int Pro

2019-2020-1 20175334 20175322 20175315 实验二 固件程序设计

我们组陈煜扬同学的博客: 实验二 固件程序设计 补充截图: 原文地址:https://www.cnblogs.com/lxr1006/p/11877739.html

MySQL数据库实验二:单表查询

实验二   单表查询 一.实验目的 理解SELECT语句的操作和基本使用方法. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1.查询全体学生的姓名.学号.所在系. SELECT Sname,S#,Sdept FROM S: 2.查询全体学生的详细记录. SELECT  * FROM S: 3.查全体学生的姓名及其出生年份. SELECT Sname,2011-Sage    /*假定当年的年份为2011年*/ FROM S: 4.查询选修了课程的学生学号.

20145221高其&amp;20145326蔡馨熠《信息安全系统设计基础》实验二 固件设计

20145221高其&20145326蔡馨熠<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux 环境下串行程序设计的基本方法. 掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用.学习使用多线程来完成串口的收发处理. 熟悉linux开发环境,学会基于S3C2410的linux开发环境的配置和使用.使用linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的

实验二 作业调度模拟程序

实验二 作业调度模拟程序 一.        实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)      采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间

实验二

实验二.pcb进程 专业 网络工程   姓名 方俊晖 学号 201406114309 一.        实验目的 通过本实验可以加深对有关进程控制块.进程队列的概念的进一步理解. 二.        实验内容和要求 1.进程PCB的结构体定义 2.定义结构体 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行的结果 三.        实验方法.步骤及结果测试 #include<stdio.h>typedef struct PCB{int time;int member;int he