【软件测试】功能性测试方法

写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!

本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/8779376.html

前一日函数PreDate是NextDate的逆函数,即给定一个年份、月份、日期,会返回前一天的日期。

输入要求:
年的取值在 1812 年到 2017 年。
日的取值在 1 日到 31 日之间。
月的取值在 1 到 12 月之间

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<bitset>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue>  
using namespace std;

int main()
{
    int year,month,day;
    cout<<"input NextDate(year month day):"<<endl;
    while(scanf("%d %d %d",&year,&month,&day)==3&&year&&month&&day)
    {
        if((year<1812||year>2017)||(month<1||month>12)||(day<1||day>31))
        {
            cout<<"input ERROR detected!"<<endl;
            continue;
        }
        bool is_leapyear=false;
        int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((year%100!=0)&&(year%400==0||year%4==0))
        {
            is_leapyear=true;
            days[2]++;
        }
        
        if(day>days[month])
        {
            cout<<"input ERROR detected!"<<endl;
            continue;
        }
        
        day--;
        if(day<=0)
        {
            day=days[month-1];
            if(day==0)    day=31;//in case of 1->12
            month--;
        }
        if(month<=0)
        {
            month=12;
            year--;
        }
        cout<<year<<'/'<<month<<'/'<<day<<endl;
    }
    return 0;
}

决策表:

 

1

2

3

4

5

6

7

8

9

C1:月份在

M1

M1

M1

M2

M2

M3

M3

M4

M4

C2:日期在

D1

D2-D5

D6

D1

D2-D6

D1

D2-D6

D1

D2-D3

C2:年份在

 

 

 

 

 

 

 

 

 

a1:不可能

 

 

X

 

 

 

 

 

 

a2:day减1

 

X

 

 

X

 

X

 

X

a3:day复位31

X

 

 

 

 

X

 

X

 

a4:day复位30

 

 

 

X

 

 

 

 

 

a5:day复位29

 

 

 

 

 

 

 

 

 

a6:day复位28

 

 

 

 

 

 

 

 

 

a7:月减1

X

 

 

X

 

 

 

X

 

a8:月复位12

 

 

 

 

 

X

 

 

 

a9:年减一

 

 

 

 

 

X

 

 

 

 

 

10

11

12

13

14

15

16

17

C1:月份在

M4

M4

M4

M5

M5

M5

M6

M6

C2:日期在

D4

D4

D5-D6

D1

D1

D2-D6

D1

D2-D6

C2:年份在

Y1

Y2

 

Y1

Y2

 

 

 

a1:不可能

 

X

X

 

 

 

 

 

a2:day减1

X

 

 

 

 

X

 

X

a3:day复位31

 

 

 

 

 

 

X

 

a4:day复位30

 

 

 

 

 

 

 

 

a5:day复位29

 

 

 

X

 

 

 

 

a6:day复位28

 

 

 

 

X

 

 

 

a7:月减1

 

 

 

X

X

 

X

 

a8:月复位12

 

 

 

 

 

 

 

 

a9:年减一

 

 

 

 

 

 

 

 

 

 

表格说明:

M1={月份:4,6,9,11月}

M2={月份:5,7,10,12月}

M3={月份:1月}

M4={月份:2月}

M5={月份:3月}

M6={月份:8月}

D1={日期:1日}

D2={日期:2<=日期<=27}

D3={日期:28日}

D4={日期:29日}

D5={日期:30日}

D6={日期:31日}

Y1={年:是闰年}

Y2={年:不是闰年}

 

测试结果:

用例ID

输入数据

预期输出

实际输出

是否通过

备注

001

2015/4/1

2015/3/31

2015/3/31

Yes

 

002

2015/4/5

2015/4/4

2015/4/4

Yes

 

003

2015/6/31

Error

Error

Yes

 

004

2015/7/1

2015/6/30

2015/6/30

Yes

 

005

2015/7/4

2015/7/3

2015/7/3

Yes

 

006

2015/1/1

2014/12/31

2014/12/31

Yes

 

007

2015/1/2

2015/1/1

2015/1/1

Yes

 

008

2015/2/1

2015/1/31

2015/1/31

Yes

 

009

2015/2/28

2015/2/27

2015/2/27

Yes

 

010

2016/2/29

2016/2/28

2016/2/28

Yes

 

011

2015/2/29

Error

Error

Yes

 

012

2016/2/31

Error

Error

Yes

 

013

2016/3/1

2016/2/29

2016/2/29

Yes

 

015

2015/3/25

2015/3/24

2015/3/24

Yes

 

016

2015/8/1

2015/7/31

2015/7/31

Yes

 

017

2015/8/5

2015/8/4

2015/8/4

Yes

 

 

  画这个决策表,我的想法是年月日三项分别代表一个自变量,每个自变量都有自己的中断点,这个些中断点可以通过分类讨论的方法来进行等价类划分。比如,年在此分为闰年和非闰年,月可分为有31日的月份、有30日的月份和2月就足够了(但是实际上我进行了进一步的细化)。日分为30、31、28、29四类即可。然后根据这些划分了2*3*4=24个等价类,将触发了相同结果的等价类合并为一以减少测试用例的数量。代码没有什么可以说的,纯面向过程,只要根据最终的测试结果完善完善即可。

 

 

 

tz@COI HZAU

2018/4/10

原文地址:https://www.cnblogs.com/acm-icpcer/p/8779376.html