他山之石,可以攻玉”这一富有哲理的成语很多人耳熟能详,但出处及全诗最初意义估计会被现在的释义转换了。其最初便出自于诗经·小雅·鹤鸣,而原诗并不意在阐释哲理,而是赞颂园林池沼的美丽。本篇说的也不是阐释哲理,也不赞颂园林之美,只是借用一下表述一下软件测试方法,我们知道同样是一头牛,疱丁解的和我们解的就会不一样,原因无他,方法正确,结构熟悉,那么软件测试的方法又有哪些呢?
测试的基本方法有两种:白盒子和黑盒子测试方法,现在来说还有白加黑的测试,即灰盒测试。那何为白盒,又何为黑盒呢,灰盒又是什么?
1.
白盒子
白盒子测试就是一种透明测试方法,测试者必须完全了解功能或特性实现的内部结构和细节。针对软件测试,白盒子测试就是通过阅读所测试软件的原代码,掌握程序所要求的参数、初始数据,设计
CASE,
使测试能遍历所有路径(分支)和满足各种条件。
白盒子测试的要点是:
ü
确定代码测试的控制点
ü
要求了解主要变量、每个函数和类、对象的作用
ü
逻辑驱动能力
ü
编写手工测试程序
ü
对过程性细节做检查
ü 对程序所有逻辑路径进行测试
白盒测试最关键是代码的覆盖面,包括:
ü
有选择地执行程序中某些最具有代表性的通路
ü
语句覆盖:使程序中每个语句至少执行一次
,
ü
条件覆盖:每个判断的每个条件的可能取值至少执行一次
ü
条件组合覆盖:使得每个判定表达始终条件的各种组合都至少出现一次
ü
路径覆盖:使程序的每条可能路径都至少执行一次
2.
黑盒子
黑盒子测试就是不要了解功能或特性实现的内部结构和细节,把程序、模块或产品看成一个黑盒子,
检查是否符合功能说明,适当地接受输入,产生输出,并保持外部信息完成性,
要清楚系统或模块要达到的目的或期望值(输入
/
输出结果)。
测试者只关心系统应该做些什么,而不管它是怎样实现的。这种方法要点是:
ü
自动创建
ü
类、对象和函数知识的限制
ü
规范所特定的
Case Table
ü
数据驱动
黑盒子测试的一些具体方法有:
ü
等价类划分黑盒测试,等价类是子集,其中的数据对于揭露程序中的错误是等效的。划分等价类是根据经验和探索性的工作,设计测试用例,使其尽可能多地覆盖有效等价类,直到所有有效等价类被覆盖
ü
边界值分析黑盒测试,它是对等价类划分的补充,不是从等价类中随便选一个数据作为代表,而是选几个特定值测之等于、刚刚大于、刚刚小于边界值。
ü
错误推测法,靠经验和直觉推测程序中可能存在的错误
,
从而针对性的编写例子
ü
因果图,适合检查输入条件的各种组合情况
ü
功能图,形式化地表示程序的功能说明
,
从而生成测试用例
3、灰盒
灰盒测试定义为将根据需求规范说明语言(RSL)产生的基于测试用例的要求(RBTC),用测试单元的接口参数加到受测单元,检验软件在测试执行环境控制下的执行情况。灰盒测试法的目的是验证软件满足外部指标要求以及软件的所有通道都进行了检验。通过该程序的所有路径都进行了检验和验证后,就得到了全面的验证。完成功能和结构验证后,就可随机地一次变化一行来验证软件测试用例在软件遇到违背原先验证的不利变化时软件的可靠性。灰盒测试法是在功能上验证嵌入式系统软件的一种10步骤法。
一般来说,单元测试采用白盒子方法,有效性测试采用黑盒子方法,集成测试采用混合方法
3. 其它测试技术和方法
ü
回归测试 (Regression testing)
── 每当软件经过了整理、修改、或者其环境发生变化,都重复进行测试。很难说需要进行多少次回归测试,特别是是到了开发周期的最后阶段。进行此种测试,特别适于使用自动测试工具。
ü
压力测试 (Stress testing)
──这种测试是用来检查系统在大负荷条件下系统运行的情况:在非正常的巨大负荷下、某些动作和输入大量重复、输入大数、对数据库进行非常复杂的查询等等,如测试一个网站在不同负荷情况下的状况,以确定在什么情况下系统响应速度下降或是出现故障。也可称性能测试 (performance testing),理想的“性能测试”(也包括其他任何类型的测试) 都应在质量保障和测试计划的文档终予以规定。
ü
恢复测试 (Recovery testing)
── 在系统崩溃、硬件故障、或者其他灾难发生之后,重新恢复系统的情况。
ü
安全测试 (Security testing)
── 测试系统在应付非授权的内部/外部访问、故意的损坏时的防护情况。
ü
兼容性测试 (Compatibility testing)
── 测试在特殊的硬件/软件/操作系统/网络环境下的软件表现。
4.
自动测试工具的作用
利用自动测试工具可以进行大量的重复性测试,减少劳动强度,而且可以进行那些手工不能实现的负载
/性能
测试案例,如大量的并发用户操作、成千上万条数据库纪录的操作等。除此之外,还可以进行:
ü
代码分析:监视代码的复杂程度,坚持标准,等等。
ü
覆盖分析:
这种工具指出哪些代码已经经过测试,可以针对代码语句覆盖、条件覆盖、和路径覆盖等。
ü
存储分析:例如边界测试和泄漏检查
(bounds-checkers and leak detectors)
ü
Web
测试
──
检查链接是否有效、
HTML
代码是否正确,检查客户端和服务器端的工作、
web
站点的交互功能是否安全。
ü
其他工具
──
用于测试案例管理、错误报告、以及结构管理。
5.
软件可靠性和程序证明技术
测试可以发现错误,并不能表明程序的正确性。因为:不论黑盒、白盒都不能实现穷举测试。对一些关键程序,如导弹发射软件,则需要考虑利用数学归纳法或谓词演算等进行证明。其基本思想是对程序功能做严格数学说明,然后根据代码,利用数学归纳法或谓词演算证明它确实能实现它的功能说明。也可以利用测试数据,建立软件可靠性模型。
正确性证明不能取代测试,证明程序功能正确,动态特征无法证明,证明过程有可能出错。目前正确性证明还不实用,工作量太大,将来可能研制出自动证明系统。