作者:Trojan 摘自:噩靈戰隊
我先在这里代表ESST所有核心给大家拜个年,祝大家新年快乐,牛年牛起来!
我们知道程序是人职能的产物,当程序写出来,要想正确无误的实现预定的各种功能,咱就必须去调试和测试.开发过软件的都知道,我们百分之30的时间用来写代码,百分之70的时间用来调试程序,可见调试程序的重要性,今天我就简单介绍下黑盒测试程序.
黑盒法也叫做黑箱法,黑箱技术,黑盒法把程序当作一个"黑盒子",不涉及程序内部的逻辑结构,也不管程序用何种语言编写,更不看程序的任何语句,只根据数据输入和结果输入,测试程序达到程序涉及说明书中功能的情况.就是一个不懂计算机的人,也可以挑选数据测试.干什么都是实践出真知,OK做到题.
编程,输入年,月,日,回答是星期几.然后用黑盒法测试这一程序.
来一起分析下:k=(y-1+int((y-1/4)-i
nt((y-1)/100)+int((y-1)/400)+s)(mod7)其中y为公元年份;int表示向原点取整;s为该年1月1日至询日天数;Mod表示以7为取模同余;k表示星期几,在主函数外部定义结构体date,含年,月,日三个成员;再定义结构体类型的变量x和指针p,黑盒法测试程序简单说
。定义数组a[12],初始化为0月~11月各月的天数.a[0]=0不用。第12月不计,s初始值为0,计算前m-1个月的总天数存入s.设变量t为闰年标志,先置t=0表示非闰年.如月大于等于3.在判断是否是闰年,是闰年改t=1.总天数s=s+t+d.s%7为星期几(0~6),利用指针数组映射为汉字(日~六) 复制内容到剪贴板代码:
struct date
{ int y,m,d;}x,*p=&x;
main()
{int i,s=0,t=0,a[]={0,31,28,31,30,31,30,31,31,30,31,30};
char *q[]={"日",”一","二","三","四","五","六"};
print("\n输入年.月.日(空格分别隔开):");
scanf("%d%d%d",&x.y,&(*p).m,&(p->d));
for (i=1;i<(*p).m;i++)s+=a;
if ((*p).m>=3)
if (x.y%400==0||x.y%100!=0&&x.y%4==0)t=1;
s=s+t+p->d;
i=x.y-1;
s=s+i+i/4-i/100+i/400;
printf("%d年%d月%d日是星期%s\n",x.y,(*p).m,p->d,q[s%7]);设程序已经输入,调试好,输入时间的年,月,日,程序都能正确的指出是星期几.但能否说程序已经毫无问题了呢?下面就用黑盒测试袄.
彻底的黑盒测试是用所有可能的输入数据来测试程序,一般来说这是根本不可能滴.对每年的12个月,每月的任一天,均可一一测到,但对年却无法测遍,因为年号可趋于无穷大.所以,人们就把所有可能输入的数据分作等价的有限类,每类中选一个或几个数据作为代表.代表通过了,这一类就全通过了.否则,这一类数据就谁也不会通过.
等价分类法可分两步进行:
根据程序说明书中的每个条件划分合理等价类和不合理等价类一个或几个。
所以上面那道题合理等价可以分为4种解法!不合理等价也分为4种.还可以用边缘值分析法,错误推测法.
呵呵是不是很晕呀.不要晕.其实不难的.听我一一道来..
(1)一般平年:1<=y<+∞;
月:1<=m<=12;日:1<=r1<=31,i=1,3,5,7,8,10,12;1<=r1<=30,j=4,6,9,10;1<=r2<=28;
(2)一般闰年:上述条件中,改r2为1<=r2<=29;
(3)逢百平年,同1
(4)逢百闰年,同2
不合理等价分为4类:
(1)y,m,d中有负数
(2)y,m,d均大于0,但其中有的带小数
(3)y>12;
(4)大月r1>31,小月ri>30,平年r2>28,闰年r2>29.
2.选择测试类
(1)对合理等价类,可选1900、2000、2008、2009作为年号代表.对其中每一个代表年,又可从大月、小月、二月底各选一天输入,程序均应给出正确结果.经测试,程序均能做到
(2)对不合理等价类,输入-2007年-1月-3日、2006.5年6.7月8.9日、2008年13月1日、2008年1月32日等.数据全是不合理的.而程序仍给出是星期几的答案.程序做了不应该的事.所以.程序有错误.
当然我们知道可以就此修改程序.设置带小数的.负数不可以.但是通过后面测试还是可以看到程序还是有问题地.
二.边缘值分析法
经验告诉我们.由于考虑问题不周.程序处理边缘值时可能犯错误.测试时候不能漏掉.边缘值也从输入和输出两个方面来考虑.
1.输入用边缘值
上述程序.公元1年1月1日、各年年初年末、各月月初月尾,都是边缘值.经过测试.程序是正确的下面举个边缘值出错的例子.
计算阶乘n! 复制内容到剪贴板
代码:
main()
{ unsigned long n,iw=2;
printf("input n:");
scanf("%lu",&n);
for (i=3;i<=n;i++)w=w*i;
printf("%lu!=%lu\n"n,w);
}当输入边缘值n=0,1时,输出0!=2,1!=2,显然是结果错误.这是因为求N的阶乘,一般总是被乘w=2,乘数从3开始.对于输入数据取值范围,测试用例一定要恰恰取到边界和稍稍过边界.如取值范围为[-100,100],先取-100,100分别测试,再取-100.1、100.1测试.对输入数据个数范围,可按最多.最小和稍稍越界选取.如字符数组定义20个字符.可分别用0、1、20、21个进行测试.
2.输出大边缘值
阶乘程序,12!=179001600,正确.12是unsigned long 型阶乘所允许的最大N.
三.错误推测法
通过对更高层次软件系统的研究、经验或直觉.推测程序中可能存在的错误,编写例子测试.这没有什么统一的方法.全靠测试者的经验.能力.水平和灵感.这是最考验.锻炼人的智能工作.
今天就啰唆到这把.不知道有几个人坚持看完他..虽然和 技术无关.但是对编程也很有作用的.一些网站代码不开源,怎么找漏洞呢?黑盒测试把...