《软件测试》(Rom Patton)读书笔记:什么是软件测试?
一、软件测试综述
左边是原文,右边是个人理解
a.软件测试的背景
软件缺陷的定义:
软件未实现产品说明书要求的功能
软件出现了产品说明书指明不应该出现的错误
软件实现了产品说明书未提到的功能
软件未实现产品说明书虽未明确提及但应该实现的目标
软件难以理解、不易使用、运行缓慢或者——从测试员的角度看——最终用户会认为不好
可以说是核心定义,软件若未完成基本功能,后面发现再多的bug也是一样的结果
一份好的产品文档会明确好边界值的
一个新功能的出现往往意味着多一份出现新bug的风险
自家项目产品可以去参考现有市场上相对成熟同类型产品的功能
简单理解就是用户体验
软件测试的目标:
软件测试员的目标是尽可能早地找出软件缺陷,并确保其得以修复
测试工程师的目标是在有限时间内确保软件质量符合预期结果
b.软件开发的过程
软件开发生命周期模式:
大瀑布模式
边写边改模式
瀑布模式
螺旋模式
简单,仅有开发软件和编写代码的过程,但测试工程师尽量避开这种模式下的测试,容易吵架
项目初期只有粗略的想法,接着进行简单设计,然后来回编写、测试、修改缺陷的漫长过程直到产品发布
过程是线性的,每个步骤独立,且无法回溯,一步接着一步进行
从小开始,定义重要功能,努力实现功能,接受用户反馈,然后进入下一阶段,重复上述过程,直至得到最终产品
敏捷软件开发是一种思想/价值观,不是技术
传统模式(如瀑布)(左)与敏捷模式(右)的区别
抵抗变化,前期把需求定死,导致后期改动成本变高
交付方式是马拉松式的,憋到最后一次性交付,产品的风险变高了
用户参与度仅在两头参与,开始的需求讨论,结尾的验收,中间过程是一个黑盒
重视文档,即“文档就是产品”
拥抱变化,假设市场、需求会变化,设计出低成本应对变化的流程
交付方式是接力赛式的,可工作的产品版本,给出去的版本可能功能不全,但是是经过测试,可以使用的版本
用户参与度是全程参与的,产品负责人每天和开发团队一起,随时确认细节,每轮版本迭代当场验收成果
重视沟通,虽然有文档,但是更推崇可以工作的软件胜过详尽的文档,团队更多的是面对面沟通,把更多精力用于写代码和让软件跑起来
c.软件测试的实质
软件测试的原则
完全测试程序是不可能的,例如:计算器软件1+1、1+2······
软件测试是有风险的行为。每个软件项目都有一个最优的测试量
测试无法显示潜伏的软件缺陷,任何情况下都不能保证缺陷没有了,唯一的办法是继续测试,可能还会找到一些
找到的软件缺陷越多,就说明软件缺陷越多,原因有很多,l例如:程序员那天心情不好、程序员的习惯错误、软件设计出现了基本问题······
软件测试越多,软件对测试的免疫力越强。反复使用相同的方式测试软件,最后软件具有抵抗力了
并非所有的软件缺陷都要修复,原因有几个:没有足够的时间、不算真正的软件缺陷、修复的风险大、不值得修复
当遇到难以说清的缺陷,应该回顾下上面的缺陷定义规则,有时候会出现一种情况,就是A觉得是缺陷,B觉得不是缺陷,彼此各抒己见
产品说明书从来没有最终版本,在软件迎合市场的环境下,需求文档可能时刻都在变化,软件测试员编写的测试用例也是可能需要不断做调整的
基于测试的工作目标,可以推测一下,软件测试员在产品小组中可能是不受欢迎的,毕竟是挑刺。所以找到保持跟项目小组和睦相处的方式也是很重要的:尽可能早点找出缺陷、控制情绪、不要总是报告坏消息
软件测试是一个讲究条理的技术职业。随着时代发展,软件测试成为了一个职业选择——需要训练和规范,而且有发展空间
测试条件重复性高的、无必要的测试用例可以剔除,采用不完全测试
测试工程师在合理且有限时间里面有效地控制测试量(最优测试量),等于也是在控制风险
优秀的测试工程师是细心的并且没法保证软件是零缺陷的,只能说是尽可能多找到缺陷
有时是这样的,软件测试过程中很长时间没找到缺陷,突然找到一个后,很快接二连三地找到更多缺陷了
身为测试工程师,针对新一轮测试,尽可能地编写不同的测试用例,对软件的不同部分进行测试,以便更容易找出软件测试。亦或者,负责A模块的测试和负责B模块的测试,可以交换本身的模块进行测试,有利于缺陷的发现
有时候测试时间被缩短,一些缺陷可能就没办法第一时间修复;需求理解错误被定义的缺陷就不需要修复了;修复风险大的缺陷导致其他软件缺陷出现,倘若在紧凑的产品发布进度下,只能选择暂不修复了;不容易出现的缺陷亦或者复现步骤繁琐的缺陷有时候是直接放过的
遇到这种情况,一般是请教直系领导的意见最稳妥了
根据项目情况灵活制定测试计划也是很重要的
早点找到缺陷,有利于问题的影响程度变小,容易让人接受;发现难以发现的大缺陷的时候控制好情绪,别兴冲冲地找开发聊天,他大概是不会高兴的;如果测试确认基本功能没问题时,可以跟开发聊聊天解解闷,毕竟工作并不是生活的全部,别只有发现缺陷才跟开发聊天,那样人家对你就会唯恐避之不及
随着时代发展,就拿目前最火的AI来说,AI也是依赖软件基础设施的,一名优秀的软件测试工程师,对于好企业来说也是香饽饽的人才
软件测试的术语与定义
精确(precision)和准确(accuracy)
精确是指正确性;准确是指稳定性

确认(verification)和验证(validation)
确认是保证软件符合产品说明书的过程;验证是保证软件满足用户需求的过程

质量(quality)和可靠性(reliability)
可靠性仅仅是质量的一个方面
摘抄原文:
软件使用者心目中的质量可能包括:软件功能的多少、在自己的PC上运行的能力、软件公司的服务电话好不好以及软件的价格。
至于产品的可靠性或者产品多长时间崩溃的问题也许重要,但常常不被考虑到。
测试(testing)和质量保证(QA)
软件测试员的目标是尽可能地找到软件缺陷,并确保缺陷得以修复
软件质量保证人员的主要职责是创建和执行改进软件开发过程并防止软件缺陷发生的标准和方法
二、测试基础
a.检查产品说明书
(1)开始测试
黑盒测试(black-box test)和白盒测试(white-box test)
静态测试(static test)和动态测试(dynamic test)
静态测试是指测试不运行的部分——只是检查和审核
动态测试是指通常意义上的测试——使用和运行软件
静态黑盒测试——测试产品说明书
个人看法:静态黑盒测试确实可以结合AI使用,一般来说项目不小的情况下,测试人员基本是一个人负责某模块的测试,让AI检查下对应模块功能的产品文档是否存在缺陷,若没有的话,自己手动检查一遍,这样测试起来会更有保障
倘若项目没有产品需求文档的话,也会有人知晓产品是什么样的,对于这种情况下,测试人员可以先收集好产品信息,反复斟酌得到更多细节,编写和完善好自己的测试用例,在准备测试前可以给开发人员看下测试用例,先不管他看不看,如果看了的话,这样有助于开发在测试期间提前发现产品不足补充细节
(2)对产品说明书进行高级审查
假设自己是客户,毕竟产品的最终目标就是满足客户需求
当第一次拿到需求文档,可以假设自己是产品的目标客户。自己研究一下客户会是什么人;和市场人员或者销售人员聊聊天,了解他们对最终用户的认识;如果产品是内部使用的软件项目,可以找到使用它的人谈一下
了解用户所想很重要,质量的定义是满足客户要求
研究现有的标准和规范,测试人员要做的是检查文档采用的标准是否正确,是否遗漏
公司惯用语和约定
行业要求
政府标准
图形用户界面(GUI)
安全标准
审查和测试类似软件
了解软件最终结果的最佳方法就是研究类似软件,但软件通常不会完全一样
(3)产品说明书的低层次测试技术
产品说明书属性检查清单
完整
准确
精确、不含糊、清晰
一致
贴切
合理
代码无关
可测试性
产品说明书用语检查清单
总是、每一种、所有、没有、从不
当然、因此、明显、显然、必然
某些、有时、常常、通常、惯常、经常、大多、几乎
等等、诸如此类、以此类推、例如
良好、迅速、廉价、高效、小、稳定
处理、进行、拒绝、跳过、排除
如果······那么······(没有否则)
b.带上眼罩测试软件
(1)动态黑盒测试:带上眼罩测试软件
选择测试用例,测试用例给出了各种输入以及测试程序的步骤
(2)通过性测试和失效性测试
通过性测试:功能实现
失效性测试:异常处理
在设计和执行测试用例时,总是首先进行通过性测试
在实效性测试之前看看软件基本功能是否能实现是很重要的,测试人员可能会吃惊地发现仅仅正常使用软件就会发现那么多软件缺陷

(3)等价类划分
等价类划分:将输入数据域划分为若干个等价类,从每个等价类中选取一个代表性数据作为测试用例
等价类类型:有效等价类、无效等价类
等价类划分——避免穷举测试
(4)数据测试
测试数据划分原则:边界条件、次边界条件、空值、无效数据
边界条件
边界数据类型:数值、速度、字符、地点、位置、尺寸、数量
边界数据类型特征:
第一个、最后一个
最小值、最大值
开始、完成
超过、在内
空、满
最短、最长
最慢、最快
最早、最迟
最大、最小
最高、最低
相邻、最远
提出边界条件时,一定要测试靠近边界的有效数据,即测试最后一个可能有效的数据,同时测试刚超过边界的无效数据
软件每个部分都可能存在边界,寻找到越多的边界,可能找到的缺陷就越多
次边界条件
次边界条件是指除了显而易见的、文档明确规定的边界值之外,那些隐藏在软件内部、逻辑复杂或非直接输入类的边界情况
常见的次边界条件
数值的次边界——除了最大值和最小值,还需关注0、1、-1以及基于单位转换(如字节、位)产品的边界
数据结构与内存的次边界——ASCII码表中的特殊字符、数组下标越界、缓冲区大小
时间与状态的次边界——闰年2月29日、跨时区的时间转换、并发操作的临界点、会话超时前一秒的操作
业务逻辑与隐含规则——来自业务规则中未直接写在输入框旁的边界
默认值、空值与特殊输入——测试null、空字符串、空格字符串的区别,以及系统默认值是否合理
默认、空白、空值、零值和无
一定要考虑建立处理默认值、空白、空值、零值或者无输入等条件的等价划分
非法、错误、不正确和垃圾数据
(5)状态测试
测试软件的逻辑流程
①建立状态转换图
软件可能进入的每一种独立状态
从一种状态转入另一种状态所需的输入和条件
进入或者退出某种状态时的设置条件及输出结果
②减少要测试的状态及转换的数量
每种状态至少访问一次
测试看起来是最常见和最普遍的状态转换
测试状态之间最不常用的分支
测试所有错误状态及其返回值
测试随机状态转换
③怎样进行具体测试
状态变量
失败状态测试
竞争条件和时序错乱
重复、压迫和重负
重复测试——内存泄漏
状态测试 vs 流程测试:状态测试侧重于对象自身的生命周期,而流程测试侧重于用户通过多个功能完成一个业务。例如:测试一个bug的“新建-已修复-已验证”是状态测试;测试开发人员提交代码后自动触发构建、部署、通知的全链路是流程测试。
状态测试 vs 等价类/边界值:等价类、边界值通常针对单个输入域;状态测试针对对象在不同阶段的行为规则。两者常结合使用,例如在“待支付”状态下,对“支付金额”字段做边界值测试。
(6)其他黑盒测试技术
像笨拙的用户那样做
在已经找到软件缺陷的地方再找找
像黑客一样考虑问题
凭借经验、直觉和预感
c.检查代码
(1)静态白盒测试:检查设计和代码
静态白盒测试是在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件的缺陷的过程,有时称为结构化分析
(2)正式审查
正式审查的四个基本要素
确定问题
遵守规则
准备
编写报告
同事审查
走查(小组审查)
检验(第三方审查)
(3)编码标准和规范
规范化的原因:可靠性、可读性/维护性、移植性
(4)通用代码审查清单
数据引用错误
数据声明错误
计算错误
比较错误
控制流程错误
子程序参数错误
输入/输出错误
其他检查
d.带上X光眼镜测试软件
(1)动态白盒测试
别名:结构化测试
(2)动态白盒测试和调试
动态白盒测试和调试有不同的目标,但是其中有交叉现象
(3)分段测试
单元测试和集成测试
递增测试:自底向上和自顶向下
(4)数据覆盖
数据流
次边界
公式和等式
错误强制
(5)代码覆盖
代码覆盖率分析器
语句覆盖或代码行覆盖
分支覆盖
条件覆盖
e.小总结
静态黑盒测试:检查产品说明书,并在软件编写之前找出问题
动态黑盒测试:在不了解软件如何工作的前提下测试
静态白盒测试:通过正式审查和检验检查代码的细节
动态白盒测试:在看到软件的工作方式时,根据获得的信息对软件进行测试
评论