一、实验目的
1、掌握决策表的概念。
决策表,也叫判定表。在所有的功能性测试方法中,基于决策表的测试方法被认为是最严格的,因为决策表具有逻辑严格性。
决策表是分析和表达多逻辑条件下执行不同操作的情况的工具。在程序设计发展的初期,决策表就已被用作编写程序的辅助工具了。它可以把复杂的逻辑关系和多种条件组合的情况表达得比较明确。方便程序员无需知道背后复杂的逻辑关系就能看出动作对应的状态。
决策表
在所有功能性测试方法中,基于决策表的测试方法是最严格的,因为决策表具有逻辑严格性。
决策表一直被用来表示和分析复杂逻辑关系。决策表很适合描述丌同条件集合下采取行动的若干组合的情况。
决策表有四个部分:桩部分、条目部分、条件部分、行动部分。
决策表通常由4个部分组成:
●条件桩(condition stub):列出了问题的所有条件。通常认为列出的条件的次序无关紧要。
●动作桩(action stub):列出了问题规定可能采取的操作。这些操作的排列顺序没有约束。
●条件项(condition entry):列出针对它所列条件的取值,在所有可能情况下的真假值。
●动作项(action entry):列出在条件项的各种取值情况下应该采取的动作。
●规则:任何一个条件组合的特定取值及其相应要执行的操作。在决策表中贯穿条件项和动作项的一列就是一条规则。显然,决策表中列出多少组条件取值,也就有多少规则,条件项和动作项就有多少列。
2、掌握决策表测试用例设计法。
决策表的测试
决策表的条件是真值表
保证能够考虑了所有可能的条件组合
使用决策表标识测试用例,能够保证一种完备的测试
为了使用决策表标识测试用例,我们把条件解释为输入,把行动解释为输出。
决策表是说明性的,给出的条件没有特别的顺序,而且所选择的行动发生时也没有任何特定顺序
二、实验任务
对NextDate问题运用决策表法设计测试用例,并执行测试,撰写实验报告。
NextDate (int month, int day, int year)函数规定:输入三个整数:month、day和year,函数的输出为输入日期后一天的日期。例如,输入为2006年3月7日,则函数的输出为2006年3月8日,year满足1920≤year≤2050。
实验步骤:
1、构造决策表
根据所有可能出现的情况列出条件桩和动作桩如下表:
条件桩 | 月份 | M1: {month=4,6,9,11} | M2: {month=1,3,5,7,8,10} | M3: {month=12} | M4: {month=2} | ||
天数 | D1: {1≤day≤26} | D2: {day=27} | D3: {day=28} | D4: {day=29} | D5: {day=30} | D6: {day=31} | |
年份 | Y1: {year是闰年} | Y2: {year不是闰年} | |||||
动作桩 | A1:day++ | A2:day=1 | A3:month+1 | A4:month=1 | A5:year+1 | A6:格式有误 |
根据上边得出决策表:
情况1 | 情况2 | 情况3 | 情况4 | 情况5 | 情况6 | 情况7 | 情况8 | 情况9 | 情况10 | 情况11 | |
月份 | M1 | M1 | M1 | M2 | M2 | M3 | M3 | M4 | M4 | M4 | M4 |
天数 | D1/D2 /D3/D4 | D5 | D6 | D1/D2/ D3/D4/D5 | D6 | D1/D2/ D3/D4/D5 | D6 | D1/D2/ D3 | D4 | D4 | D4/D5 /D6 |
年份 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1/Y2 | Y1 | Y2 | Y1/Y2 |
动作 | A1 | A3,A2 | A6 | A1 | A3,A2 | A1 | A5,A4,A2 | A1 | A3,A2 | A6 | A6 |
简化后:
情况1,4,6,8 | 情况2,5,9 | 情况3,10,11 | 情况7 | |
月份 | M1,M2,M3,M4 | M1,M2,M3 | M1,M4 | M3 |
天数 | D1,D2,D3,D4 | D5 | D6 | D6 |
年份 | Y1,Y2 | Y1,Y2 | Y1,Y2 | Y1,Y2 |
动作 | A1 | A3,A2 | A6 | A5,A4,A2 |
2、根据决策表设计测试用例,得到测试用例表。
测试用例编号 | 输入 月份:天数:年份 | 预期输出 | 实际输出 |
T1 | 3:21:1919 | 格式有误 | 请输入月份、天数、年份:3 21 1919 输入有误! |
T2 | 2:28:1920 | 1920年2月29日 | 请输入月份、天数、年份:2 28 1920 下一天是:1920年2月29日 |
T3 | 3:31:1921 | 1921年4月1日 | 请输入月份、天数、年份:3 31 1921 下一天是:1921年4月1日 |
T4 | 13:15:1930 | 格式有误 | 请输入月份、天数、年份:13 15 1930 输入有误! |
T5 | 12:30:2024 | 2024年12月31日 | 请输入月份、天数、年份:12 30 2024 下一天是:2024年12月31日 |
T6 | 2:30:1928 | 格式有误 | 请输入月份、天数、年份:2 30 1928 输入有误! |
T7 | 2:29:1928 | 1928年3月1日 | 请输入月份、天数、年份:2 29 1928 下一天是:1928年3月1日 |
T8 | 11:30:2040 | 2040年12月1日 | 请输入月份、天数、年份:11 30 2040 下一天是:2040年12月1日 |
T9 | 1:29:2051 | 格式有误 | 请输入月份、天数、年份:1 29 2051 输入有误! |
T10 | 12:31:2050 | 2051年1月1日 | 请输入月份、天数、年份:12 31 2050 下一天是:2051年1月1日 |
3、执行测试。
4、填写软件缺陷报告。
测试缺陷报告:
测试模块: | 输入月份/天数/年份,输出下一天 | 开 发 者: | XXX |
测 试 员: | XXX | 测试日期: | 2024.4.10 |
软件缺陷列表 | |||
缺陷ID | 缺陷详细信息 | ||
BUG1 | 无 | ||
BUG2 | 无 | ||
BUG3 | 无 | ||
BUG4 | 无 |
5、代码(C)
#include <stdio.h>
#include <stdlib.h>
int main(){
int year;
int month;
int day;
printf("请输入月份、天数、年份:");
scanf("%d %d %d",&month,&day,&year);
while(year>2050||year<1920)
{
printf("输入有误!\n");
return 0;
}
while(month>12||month<1)
{
printf("输入有误!\n");
return 0;
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
while(day>31||day<1)
{
printf("输入有误!\n");
return 0;
}
}
if(month==4||month==6||month==9||month==11)
{
while(day>30||day<1)
{
printf("输入有误!\n");
return 0;
}
}
if((year%4==0&&year%100!=0)||(year%400==0))
{
if(month==2)
{
if(day>29)
{
printf("输入有误!\n");
return 0;
}
else
{
if(day==29)
{
day=1;
}
else
{
day++;
}
}
}
}
else
{
if(month==2)
{
if(day>28)
{
printf("输入有误!\n");
return 0;
}
else
{
if(day==28)
{
day=1;
}
else
{
day++;
}
}
}
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if(day==31)
{
month++;
day=1;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
else
{
day++;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
case 2:
if(day==1)
{
month++;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
else
{
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
case 4:
case 6:
case 9:
case 11:
if(day==30)
{
month++;
day=1;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
else
{
day++;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
case 12:
if(day==31)
{
year++;
month=1;
day=1;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
else
{
day++;
printf("下一天是:%d年%d月%d日\n",year,month,day);
break;
}
}
return 0;
}