所有连载内容,都经过了原作者授权,希望把知识以电子版的形式分享给大家。
由于我们很难把书籍上面的内容一比一完全还原,甚至可能会发生编辑错误的地方,如果您发现了问题,还请联系我们。
另外,如果您对连载书籍感兴趣的话,可以同时购买正版图书,一是支持作者,二是可以随时做笔记并且同步学习。
本书可以在京东、淘宝、天猫、当当、书籍出版社、线下书店等任何可以购买书籍的渠道购买。如果您想要图书作者亲笔签名版图书,也可以联系我们,原价邮寄,不收取任何额外费用。
上期更新的是《软件测试实用技术与常用模板 第2版》书中第一章1.2章节的部分内容,本期继续。
软件测试的目的
不同的机构会有不同的测试目的;相同的机构也可能有不同测试目的,可能是测试不同区域或是对同一区域的不同层次的测试。
软件测试的目的决定了如何去组织测试。如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。
测试可视为分析、设计和编码3个阶段的“最终复审”,在软件质量保证中具有重要地位。为了确保软件的质量,较理想的做法应该是对软件的开发过程,按软件工程各阶段形成的结果,分别进行严格的审查。
软件测试的目的可认为:
l 帮助开发人员、测试工程师,发现问题、分析问题;
l 减少软件的缺陷数目或者降低软件的缺陷密度;
l 提高软件的可靠性;
l 评估软件的性能指标;
l 增加用户对软件的信心;
l 测试的最终目的是为了避免错误的发生,确保应用程序能够正常高效的运行。
对于软件测试目的,Grenford J.Myers提出以下观点:
(1) 软件测试是为了发现错误而执行程序的过程;
(2) 测试是为了证明程序有错,而不是证明程序无错误。
(3) 一个好的测试用例是在于它能发现至今未发现的错误;
(4) 一个成功的测试是发现了至今未发现的错误的测试。
这种观点可以提醒人们测试要以查找错误为中心,而不是为了演示软件的正确功能。但是仅凭字面意思理解这一观点可能会产生误导,认为发现错误是软件测试的唯一目,查找不出错误的测试就是没有价值的,事实并非如此。
首先,测试并不仅仅是为了要找出错误。通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便改进。同时,这种分析也能帮助我们设计出有针对性地检测方法,改善测试的有效性。
其次,没有发现错误的测试也是有价值的,完整的测试是评定测试质量的一种方法。详细而严谨的可靠性增长模型可以证明这一点。例如 Bev Littlewood发现一个经过测试而正常运行了n小时的系统有继续正常运行n小时的概率。
根据上述的测试目的,软件测试的原则应该是:
(1)应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
由于原始问题的复杂性,软件的复杂性和抽象性,软件开发各个阶段工作的多样性,以及参加开发各种层次人员之间工作的配合关系等因素,使得开发的每个环节都可能产生错误。所以不应把软件测试仅仅看作是软件开发的一个独立阶段,而应当把它贯穿到软件开发的各个阶段中。坚持在软件开发的各个阶段的技术评审,这样才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期,杜绝某些隐患,提高软件质量。
(2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。
测试以前应当根据测试的要求选择在测试过程中使用的测试用例(Test case)。测试用例主要用来检验程序员编制的程序,因此不但需要测试的输入数据,而且需要针对这些输入数据的预期输出结果。如果对测试输入数据没有给出预期的程序输出结果,那么就缺少了检验实测结果的基准,就有可能把一个似是而非的错误结果当成正确结果。
(3)程序员应避免检查自己的程序。
测试工作需要严格的作风,客观的态度和冷静的情绪。人们常由于各种原因具有一种不愿否定自己工作的心理,认为揭露自己程序中的问题总不是一件愉快的事。这一心理状态就成为测试自己程序的障碍。另外,程序员对软件规格说明理解错误而引入的错误则更难发现。如果由别人来测试程序员编写的程序,可能会更客观,更有效,并更容易取得成功。要注意的是,这点不能与程序的调试(debuging)相混淆。调试由程序员自己来做可能更有效。
(4)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
合理的输入条件是指能验证程序正确的输入条件,而不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。在测试程序时,人们常常倾向于过多地考虑合法的和期望的输入条件,以检查程序是否做了它应该做的事情,而忽视了不合法的和预想不到的输入条件。事实上,软件在投入运行以后,用户的使用往往不遵循事先的约定,使用了一些意外的输入,如用户在键盘上按错了键或打入了非法的命令。如果开发的软件遇到这种情况时不能做出适当的反应,给出相应的信息,那么就容易产生故障,轻则给出错误的结果,重则导致软件失效。因此,软件系统处理非法命令的能力也必须在测试时受到检验。用不合理的输入条件测试程序时,往往比用合理的输入条件进行测试能发现更多的错误。
(5)充分注意测试中的群集现象。
测试时不要以为找到了几个错误问题就已解决,不需继续测试了。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目或检错率成正比。根据这个规律,应当对错误群集的程序段进行重点测试,以提高测试投资的效益。
在所测程序段中,若发现错误数目多,则残存错误数目也比较多。这种错误群集性现象,已为许多程序的测试实践所证实。例如美国IBM公司的0s/370操作系统中,47%的错误仅与该系统的4%的程序模块有关。这种现象对测试很有用。如果发现某一程序模块似乎比其他程序模块有更多的错误倾向时,则应当花费较多的时间和代价测试这个程序模块。
(6)严格执行测试计划,排除测试的随意性。
测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方式和过程,系统组装方式,跟踪规程,调试规程,以及回归测试的规定等以及评价标准。对于测试计划,要明确规定,不要随意解释。
(7)应当对每一个测试结果做全面检查。
这是一条最明显的原则,但常常被忽视。有些错误的征兆在输出实测结果时已经明显地出现了,但是如果不仔细地全面地检查测试结果,就会使这些错误被遗漏掉。所以必须对预期的输出结果明确定义,对实测的结果仔细分析检查,抓住征候,暴露错误。
(8)妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。
(9)应尽可能早地开始测试
在软件生命周期中,1个错误发现的越晚,修复错误的费用越高。如表1-2所示。
表1-2修复错误的费用
阶段 | 相对修复费用 |
需求阶段 | 0.1 ~ 0.2 |
设计阶段 | 0.5 |
编码阶段 | 1 |
单元测试阶段 | 2 |
验收阶段 | 5 |
维护阶段 | 20 |
(10)测试应从“小规模”开始,逐步转向“大规模”。最初的测试通常把焦点放在单个程序模块上,进一步测试的焦点则转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。
(11)测试用例应由测试输入数据、测试执行步骤和与之对应的预期输出结果三部分组成。
(12)按照组件和功能特征的优先级从高到低的顺序进行测试
(13)重点放在处理多语言字符串的直接或间接的输入/输出(I/O)
(14)对测试错误结果一定要有一个确认的过程
(15)回归测试的关联性
回归测试的关联性一定要引起充分的注意,修改一个错误而引起更多错误出现的现象并不少见。
(16)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
合理的输入条件是指能验证程序正确的输入条件,不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。软件系统处理非法命令的能力必须在测试时受到检验。用不合理的输入条件测试程序时,往往比用合理的输入条件进行测试能发现更多的错误。
下期预告
下期更新
书中1.4章节的内容
敬请期待!