热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

《软件测试的艺术》读书笔记(一)

这是一本于1979年出版的书,比大多数中国互联网从业者的年纪还要大,但其中的观念却仍然适用。软件测试常常被计算机专业的毕业生当作自己能力不足以做开发工作的“备选”职位,似乎大家默认觉得这个岗位的要求会比程序员低。事实也确实如此,从薪资来说,软件测试尤其是功能测试的待遇比程序员

这是一本于 1979 年出版的书,比大多数中国互联网从业者的年纪还要大,但其中的观念却仍然适用。
软件测试常常被计算机专业的毕业生当作自己能力不足以做开发工作的“备选”职位,似乎大家默认觉得这个岗位的要求会比程序员低。
事实也确实如此,从薪资来说,软件测试尤其是功能测试的待遇比程序员低很多。即使是需要编程基础的自动化测试,月薪也比同样工作经验的程序员低了三分之一到四分之一。但即便如此,就像大多数初级程序员普遍缺少编程系统知识一样,软件测试工程师们的资质也是良莠不齐。这不仅体现在基础工作技能如文档编写、沟通能力上,更体现在他们本应掌握的职业经验和思维上。或许很多人会觉得自己的测试水平不错,日常的测试任务也能很好的完成,没有出现重大的疏漏。然而,这样就算优秀的软件测试工程师了吗?

1 测试能力的自我评估

第一章作者先出了一道测验。

我们要求设计一组测试用例(特定的数据集合),适当地测试一个相当简单的程序。为此要为该程序建立一组测试数据,程序须对数据进行正确处理以证明自身的成功。下面是对程序的描述:

这个程序从一个输入对话框中读取三个整数值。这三个整数值代表了三角形三边的长度。程序显示提示信息,指出该三角形究竟是不规则三角形、等腰三角形还是等边三角形。

作为产品,我能想到的就是:

1. 提供几组有效数据,分别符合不规则三角形、等腰三角形和等边三角形的条件
2. 提供无效数据,例如只有 1 个或者两个整数,提供 3 个小数。

我们再来看看参考答案:

用你的测试用例集回答下列问题,借以对其进行评价。对每个回答“是”的答案,可以得 l 分:

1. 是否有这样的测试用例,代表了二个有效的不规则三角形?(注意,如 1,2,3 和 2,5,10 这样的测试用例并不能确保“是”的答案,因为具备这样边长的三角形不存在。)

2. 是否有这样的测试用例,代表一个有效的等边三角形?

3. 是否有这样的测试用例,代表一个有效的等腰三角形?(注意如 2,2,4的测试用例无效,因为这不是一个有效的三角形。) 

4. 是否能少有三个这样的测试用例,代表有效的等腰三角形,从而可以测试到两等边的所有三种可能情况?(如 3,3,4;3,4,3;4,3,3) 

5. 是否有这样的测试用例,某边的长度等于 0?6. 是否有这样的测试用例,某边的长度为负数?

7. 是否有这样的测试用例,三个整数皆大于 0,其中两个整数之和等于第三个?(也就是说,如果程序判断 l,2,3 表示一个不规则二角形,它可能就包含一个缺陷。) 8. 是否至少有三个第 7 类的测试用例,列举了一边等于另外两边之和的全部可能情况(如 1,2,3;1,3,2;3,1,2)?

9. 是否有这样的测试用例,三个整数皆大于 0,其中两个整数之和小于第三个整数?(如 1,2,4;12,15,30)

10. 是否至少有三个第 9 类的测试用例,列举了一边大于另外两边之和的全部可能情况?(如 1,2,4;1,4,2;4,1,2)

11. 是否有这样的测试用例,三边长度皆为 0(0,0,0)?

12. 是否至少有一个这样的测试用例,输入的边长为非整数值(如 2.5,3.5,5.5)

13. 是否至少有一个这样的测试用例,输入的边长个数不对(如仅输入了两

个而不是三个整数)? 

14. 对于每一个测试用例,除了定义输入值之外,是否定义了程序针对该输入值的预期输出值?

如果你和我一样只得了 3~4 分,也很正常,因为据说高水平的专业程序员平均得分仅 7.8(满分 14)。

2.1 软件测试的心理学

很多人和我一样,陷入了一个误区,认为软件测试的目的是证明软件完美无缺,只有不存在错误的测试才是成功的。
而作者举了一个例子,假如你生病了去医院检查身体,什么样的检测结果才能称作成功?是明明你受到病痛的折磨,花费了金钱和精力做了大量检查,却没有发现任何问题,还是通过检查确定了问题,医生可以据此给出诊疗方案呢?软件测试也是如此,我们的目的应该是尽可能的发现错误并修复它,以此提高软件的稳定性和可靠性。要证明软件的完美无缺本身就是个“不可能完成的任务”,抱着这样的想法,软件测试人员就会倾向于适用更不容易产生错误的数据进行调试,从而避免出现更多错误,而这背离了软件测试的初衷。

测试是为发现错误而执行程序的过程”。

2.2 软件测试的经济学

黑盒测试:不去管程序的内部逻辑,用所有符合条件的数据输入进行测试。但是,就拿常见的注册功能来说。仅仅是密码这一项,支持字母、数字和常见符号,要列出所有的可能性,光是数字和字母的排列组合就是个天文数字。就算是非测试人员也能看出来这样的测试会花费很长时间并且没有必要。白盒测试:在考虑程序内部逻辑结构的基础上,将每一条语句可能存在的逻辑路径都执行一遍。和黑盒测试一样,即使是一个简单的程序,逻辑路径的分支数量也十分庞大。况且,逻辑测试也存在缺陷,无法发现设计规范问题、缺少必要路径的问题和数据错误。
总之,从成本考虑,程序测试应该以数量最小的测试用例发现更多的问题,以最小的代价取得最大的成果。

2.3 软件测试的原则

原则 1:测试用例中一个必需部分是对预期输出或结果的定义

常见的错误是对输入和输出的定义都很模糊,例如下面这个测试用例:

 上图中存在以下问题:

1. 剪切的组件消失应该是预期结果而不是操作步骤。

2. 显示正确本身就是一个十分模糊的定义,应该使用更加精准的描述:其中包括组件行数、粘贴后选中状态、参数内容等。

原则 2:程序员应当避免测试自己编写的程序

在我还是游戏策划的时候,经常对程序员同事对错误的“视而不见”感到不可思议。
明明是只要按照正常流程使用就能立即发生的错误,居然到了测试阶段才发现。现在想来,除了工作流程的问题(当时的团队没有要求程序员自己按照使用流程对程序进行验收的步骤),更重要的是心理问题。
当我自己开始编写程序之后,测试提出的一些问题也让我觉得:我竟然犯了这样明显的错误。再后来看了一本书叫《看不见的大猩猩》,人的精力是有限的,当放在自认为更重要的事情上时,就很容易忽略别人看起来很明显的存在。这不是主观故意的忽视,而是客观存在的科学。当然也不排除某些同事确实存在偷懒的情况,没有完成开发测试。

原则 9:程序某部分存在更多错误的可能性,与该部分已发现错误的数目成正比。

直白点说,就是如果一个模块已经发现的 bug 数量明显多于其他模块,那么未来在这个模块发现 bug 的可能性仍然很高。
测试用例的设计也应该有所侧重,对已有 bug 数多的部分进行额外的测试。

原则 10:软件测试是一项极富创造性、极具智力挑战性的工作。

大家倾向于认为在项目团队中最重要的是开发人员,其他岗位都是辅助性工作,但从市场营销的角度来说,团队中的每个位置都至关重要。
区别只在于所做工作对实现目标的重要性和可替代性,优秀的测试的重要程度并不亚于程序员。不管什么岗位,都需要不断的学习提升通用技能和专业能力。如果自己都不认同所在岗位存在的价值,认为无需努力提升自己,那不管在什么岗位都会被时代所淘汰。

2.4 小结

三个重要的测试原则:

• 软件测试是为发现错误而执行程序的过程。

• 一个好的测试用例具有较高的发现某个尚未发现的错误的可能性。

• 一个成功的测试用例能够发现某个尚未发现的错误。


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 解决PR倒放后视频卡顿的方法及操作步骤
    本文介绍了解决PR倒放后视频卡顿问题的方法,通过标记入点和出点,并进行渲染,可以有效解决视频卡顿的情况。详细的操作步骤包括:继续播放视频,标记入点和出点,选择渲染效果,等待渲染完成,清除标记等。通过理论与实践的结合,可以更好地帮助大家解决PR倒放后视频卡顿的问题。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
author-avatar
今生绝恋2702934494
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有