第七章软件测试
编码完成之后,就是对源程序进行测试。软件测试是一项“劳民伤财”的工作,统计表明,开发大规模的软件,有40%以上的精力是耗费在软件测试上(40-20-40规则,Myers认为软件测试占大约50%的项目时间和超过50%总成本)。为了保证软件的正确可靠、为了防患于未然,无论怎样强调软件测试的重要性,都不过分。
关于软件测试,曾有种种似是而非的说法,众多的术语和测试技术,也常使我们眼花缭乱。在这里我试尝给大家勾画出一个清晰的逻辑轮廓。
基本概念
软件测试的目的(与地位)
《软件测试技巧》,他在书中说道:“测试是为了发现错误而执行程序的过程。”
:“程序测试能证明错误的存在,但不能证明错误不存在。”
在这里,他们明确指出:测试的目的是发现程序中的错误,是为了证明程序有错,而不是证明程序无错。(其实你也证明不了)
在软件开发过程中,分析、设计、编码等工作都是建设性的,唯独测试带有“破坏性”,因为它抱着“吹毛求疵”的目的,明确宣布要在程序中“找岔子”。他们认为这种吹毛求疵的态度是至关重要的(态度决定一切!)。如果你是为了证明程序无错而去进行测试,错误就可能在你的眼皮底下漏过,反之,只要你抱着证明程序有错的目的去测试,就会尽心尽力去找程序中的错误。
根据Myers的说法,测试又是一个“(在计算机上)执行程序的过程”。分析和设计阶段都要对文档进行技术审查和管理复审,源程序完成后,也要进行代码复审(code review)。这些审查对减少软件错误有重要作用,但都不能代替在计算机上进行的测试,,测试可视为分析、设计、编码3个阶段的“最终复审(ultimate review)”,可见测试在软件质量保证中的重要地位。
现在我们干脆把Myers的:“程序测试是为了发现错误而执行程序的过程。”作为软件测试的定义。
另一个与测试密切相关的活动叫纠错(debugging),我们也常常说起“纠错和调试”。
[纠错和调试]测试的目的是发现错误,纠错则是为了确定错误的性质,并且加以纠正。因此,软件测试其实是这样一个过程:
测试——纠错——测试——纠错——…………, 这种边测试边纠错的活动,常常借助于一种称为调试程序(debugging routine)的专用工具,所以也有人把纠错称为调试。
软件测试的方法和技术
广义地说,软件测试不仅指在计算机上进行的测试(机器测试),也应包括用人工方式进行的代码复审(人工测试),下面我们列出这两类测试所采用的方法和技术。
[注]
(1)机器测试和人工测试
程序通过编译后,先要经代码复审,然后再进行机器测试。机器测试是用设定的测试数据(test data)执行被测程序的过程,故又称为动态测试(dynamic testing)。代码复审采用人工的方式进行,目的在于检查程序的静态结构,找出编译不能发现的错误。经验表明,组织良好的代码复审,可以发现程序中30%到70%的编码和逻辑错误,从而加快动态测试的进程,提高整个测试的效率。
根据Myers的研究:人工测试和机器测试是互补的。而且,机器测试只能发现错误的症状,人工测试一旦发现了错误,也就同时确定了错误的位置与性质。人工测试并不是可有可无的,或是为了节约计算机机时而采取的权宜之计,它是机器测试的准备,也是测试中不可缺少的环节。
(2)白盒测试和黑盒测试
动态测试是一个包括:①设计“测试用例”→②执行被测程序→③分析测试结果并发现错误的过程。
[测试用例]以发现程序的错误为目的,而精心设计的一组测试输入数据,以及用这组数据执行被测程序时所期望的输出结果。
测试用例={ 输入数据+ 期望结果}
【注】其中{ }表示重复
在这一过程中,毫无疑问①设计“测试用例”是最关键!这是因为只有合理设计的“测试用例”,才可能最大限度地发现程序中的错误,从而有效地完成测试任务。
我们按照在设计“测试用例”时,是否涉及程序的内部结构,把动态测试分为:“白盒测试”和“黑盒测试”。
(3)穷举测试和选择测试
能不能通过动态测试,发现程序中的所有错误呢?
人们自然地想到:应该让被测程序在一切可能的输入情况下执行一遍,这就是所谓的“穷举测试”。
那么穷举测试可能吗?请看:
[试对一个“C++编译器”进行黑盒穷举测试] 一方面要编写出所有能够想象出来的
合法的C++程序让它编译,另一方面又要编写出一切不合法的C++程序,看它能否指出程序的错误。显而易见,合法与不合法的C++程序的数量都是无穷的,因此,用黑盒测试方法进行穷举测试是不可能的。
[试对下图所示的程序进行白盒穷举测试]
[注]51+5
第七章软件测试 来自淘豆网www.taodocs.com转载请标明出处.