关于决策表
决策表决策表又称判断表,是一种呈表格状的图形工具,适用于描述处理判断条件较多,各条件又相互组合、有多种决策方案的情况。精确而简洁描述复杂逻辑的方式,将多个条件与这些条件满足后要执行动作相对应。但不同于传统程序语言中的控制语句,决策表能将多个独立的条件和多个动作直接的联系清晰的表示出来。
决策表最突出的优点是,能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。利用决策表能够设计出完整的测试用例集合。
决策表能罗列出所有的情况,并清晰的指出相应的处理方式,用户不需要考虑其中的逻辑关系就能一眼看出其中什么样的动作对应什么样的情况,这比程序语言中层层嵌套的逻辑语句要强多了。而所有可能情况的平面罗列,也能避免在程序语言编写中,因为逻辑的层层嵌套而产生遗漏,尤其在if-then-else结构中else部分是可选的情况下。
决策表法是黑盒测试方法中最为严格、最具有逻辑性的测试方法。
实验内容
分析
输入:year month day
操作:
day变量值减1
day复位为30
day复位为31
day复位为30
day复位为29
day复位为28
month变量值减1
month复位为12
year变量值减1
(2)规则
M1={ month有30天 }
M2={ month有31天,1月、3月、8月除外 }
M3={ month是1月 }
M4={ month是2月 }
M5={ month是3月 }
M6={ month是8月 }
D1={ day=1 }
D2={ 2≤day≤27 }
D3={ day=28 }
D4={ day=29 }
D5={ day=30 }
D6={ day=31 }
Y1={ year是闰年 }
Y2={ year不是闰年 }
绘制决策表
根据决策表设计测试用例
测试结果为:
实验代码
#include<iostream>
using namespace std;
int valid(int y,int m,int d)
{
if(1812>y || y>2017) return 0;
if(m<1 || m>12) return 0;
if(d<1) return 0;
switch(m)
{
case 1: {if (d >31) return 0;break;}
case 2:
{
if (y%400==0 || y%4==0)
{
if (d>29) return 0;
}
else
{
if (d>28) return 0;
}
break;
}
case 3: {if (d >31) return 0;break;}
case 4: {if (d >30) return 0;break;}
case 5: {if (d >31) return 0;break;}
case 6: {if (d >30) return 0;break;}
case 7: {if (d >31) return 0;break;}
case 8: {if (d >31) return 0;break;}
case 9: {if (d >30) return 0;break;}
case 10: {if (d >31) return 0;break;}
case 11: {if (d >30) return 0;break;}
case 12: {if (d >31) return 0;break;}
}
return 1;
}
void predate(int y,int m,int d)
{
if (d>1)
{
cout<<"前一天的日期为: "<<y<<" "<<m<<" "<<d-1<<endl;
}
else
{
switch(m-1)
{
case 0:{cout<<"前一天的日期为: "<<y-1<<" "<<12<<" "<<31<<endl;break;}
case 1:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 2:
{
if (y%100==0 || y%4==0)
{
cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<29<<endl;break;
}
else cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<28<<endl;break;
}
case 3:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 4:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<30<<endl;break;}
case 5:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 6:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<30<<endl;break;}
case 7:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 8:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 9:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<30<<endl;break;}
case 10:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<31<<endl;break;}
case 11:{cout<<"前一天的日期为: "<<y<<" "<<m-1<<" "<<30<<endl;break;}
}
}
}
int main()
{
int year,month,day;
int t;
while(1)
{
cout<<"请输入日期 \n";
cin>>year>>month>>day;
if (valid(year,month,day)==0)
{
cout<<"输入日期有误,请重新输入"<<endl;
continue;
}
predate(year,month,day);
cout<<"请输入 1继续 0退出"<<endl;
cin>>t;
if(t==1) continue;
else break;
}
return 0;
}