课件

14.1软件测试概念.pdf

关于软件质量的问题

在理想的情况下,开发人员编写完代码之后,所有程序都应该能够运行起来,并按照预期的行为进行工作,但是现实往往没有这么美好,即使是那些大公司发布的产品,依然会存在这样那样的问题。

CleanShot 2022-05-14 at 11 AM.51.31@2x.png
↑这是比尔盖茨在 Win98 新闻发布会上,在演示 Win98 的 USB 功能时,遭遇到蓝屏死机,现场颇为尴尬。

软件在投入运行之后出现问题的事例数不胜数。软件测试作为开发过程的最后一个关键活动,对软件质量保证具有非常重要的作用。

“Bug”的由来

CleanShot 2022-05-14 at 11 AM.54.45@2x.png
我们经常会听到 bug 这个词,它的原意是臭虫或者虫子,现在经常被人们用于表示隐藏在计算机系统中的一些没有被发现的缺陷或者问题。

CleanShot 2022-05-14 at 11 AM.56.58@2x.png
这个词的由来可以追溯到 1945 年,一只飞蛾钻进了计算机电路里导致系统无法工作,当时格蕾丝·赫柏中尉把死去的飞蛾贴到在工作日志上,写道就是这个 bug 害得我们今天的工作无法完成。从此,人们把计算机的错误戏称为 Bug,而将发现 Bug 并纠正的过程称为 Debug。那么软件缺陷是如何产生的呢?

软件缺陷的产生

CleanShot 2022-05-14 at 11 AM.59.03@2x.png
软件开发是由人来实施的,犯错可以说是人的天性,由于认识不足、关注度和策略等一系列的问题,人们不可避免地就会在需求分析、总体设计、详细设计和编码调试的过程中出现错误,而这些错误就造成了软件产品的缺陷。

一个真实的例子:
CleanShot 2022-05-14 at 12 PM.00.43@2x.png
1991年的海湾战争期间,一枚伊拉克飞毛腿导弹击中了沙特阿拉伯的一个军营,造成了 28 名美国士兵丧生,事后的调查发现,由于程序的计时使用系统时钟并用整数表示,而系统时钟的1换算成秒是1/10秒,这样寄存器存储并计算导弹的时间就会产生一个很微小的误差,但是系统缺少有效的防范措施,当爱国者导弹连续工作了100小时之后,导弹的时钟已经偏差了差不多1/3秒,这相等于600米的距离误差,由于这个时间的误差,即使是雷达糸统侦查到飞毛腿导弹而且预计了它的弹道,系统也找不到实际上来袭的导弹,最终导致了悲剧的发生。

软件测试

通过现实中的一些例子我们已经看到,软件发生错误时,会对人类的生活造成或大或小的影响,有的甚至会带来灾难性的后果。软件测试可以使这种风险降低,开发人员通过测试尽可能地发现隐藏在软件中的缺陷,并且及时地修复它们,从而保证最终交付出经过严格检验的一个完整产品,而不是那些触就死机的定时炸弹。

定义

软件测试的概念可以从正向思维和逆向思维两个方面来理解:
CleanShot 2022-05-14 at 1 PM.57.19@2x.png
从正向思维来看,软件测试就是试图验证软件能够正常工作的。而逆向思维是假定软件是有缺陷的,通过设计和执行一些测试用例来证明程序执行错误的假设。

按照正向思维的模式,测试需要针对系统的所有功能逐个验证它们的正确性。测试用例通常是使用有效的数据、正确的流程和一些多样化的场景,通过执行这些用例来证明软件是成功的。

在逆向思维中,测试人员要不断思考开发人员理解上的误区、一些不良的编程习惯、各种边界和无效的输入、系统的一些薄弱环节,通过试图破坏或者摧毁系统的方式,来查找软件中的问题。

目的

  • 直接目标:发现软件错误
    • 软件测试要从发现错误入手,也就是说它直接的目标是以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷。通过修正这些错误和缺陷来提高软件的质量。但是发现错误并不是测试的最终目的。
  • 期望目标:检查系统是否满足需求
    • 测试最终还是要对软件质量进行度量和评估,以验证软件质量满足客户需求的程度。
  • 附带目标:改进软件过程
    • 当然在测试过程中,通过分析错误产生的原因,可以发现当前开发过程中存在的问题,从而进行软件过程的改进。

局限性

测试是软件质量保证的一种有效手段,但是测试本身也存在一些局限性:

  • 测试的不彻底性
    • 测试只能证明错误的存在,而不能证明错误不存在
    • 软件经过测试之后,也不能保证没有缺陷和错误
  • 测试的不完备性
    • 测试无法覆盖到每个应该测试的内容
    • 我们不可能使用穷举的方法把所有输入和程序分支都测试到,所以,设计好的测试用例是非常关键的
  • 测试作用的间接性
    • 测试并不能直接提高软件质量,软件质量的提高还是要依靠开发,但没有测试也是万万不可行的
    • 通过测试来发现缺陷,进一步促进修正缺陷,从而间接地起到提高软件质量的作用

测试应尽早介入

CleanShot 2022-05-14 at 2 PM.15.32@2x.png
尽早地介入,是软件测试提倡的一个基本原则,在软件开发的各个阶段都有可能引入错误,而且前期阶段存在的缺陷会随着软件开发过程的推进而不断地放大,缺陷发现和修复得越早,所花费的成本也越低。早期的缺陷在开发后期或者投入运行之后再被发现和修复,成本有可能会扩大到几十倍或者上百倍。

缺陷的集群性

软件错误具有聚集性,它也符合二八原则,即 80% 的缺陷常常存在于 20% 的代码中。如果要使软件测试更加有效,就要记住常光临一些缺陷的高危多发地段,在那里发现缺陷的可能性就会大得多。经验表明,测试后程序中残留的错误数目与该程序中已检出的错误成正比:
CleanShot 2022-05-14 at 2 PM.18.41@2x.png

杀虫剂悖论

软件测试用例具有杀虫剂效应,我们知道给果树喷酒农药,时间长了虫子就会对杀虫剂产生耐药性:
CleanShot 2022-05-14 at 2 PM.21.03@2x.png
测试用例也需要定期评审和修改,同时要不断增加新的不同测试用例来测试软件的不同部分,从而发现更多潜在的缺陷。

软件测试思维

软件测试是通过寻找缺陷来提高软件的质量,那么测试需要重点培养什么样的思考问题的方法?测试人员应该具备的不同思维模式:
CleanShot 2022-05-14 at 2 PM.22.08@2x.png
其中最重要的就是逆向思维发散思维

  • 逆向思维强调的是按照与常规思路相反的方向进行思考,通常开发人员运用正向的思维去进行软件开发,所以逆向思维可以发现更多开发人员思维上的漏洞。
  • 发散思维是一种寻求多种答案最终使问题获得解决的思考方法,这种思维方式可以开阔眼界、活跃思想,用比较独特的视角来看待软件。

不同的思维方式各自有不同的特点,我们平时也会有意识或无意识地应用这些思维,但是只有不断地学习、实践和思考,才能做好软件测试的工作。