-
它太浪费时间了,现在要赶进度,时间上根本不允许,或者随便做做应付领导。
-
我是一个很棒的程序员,我写的代码肯定是没有问题的。
-
做单元测试太烦了,直接集成,到时有问题在集成测试时肯定能发现的,实在不行在系统测试总该能发现吧。
-
它仅仅是证明这些代码做了什么。
-
时间方面:如果认真的做好了单元测试,在系统集成联调时非常顺利,因此会节约很多时间,反之那些由于因为时间原因不做单元测试或随便做做的则在集成时总会遇到那些本应该在单元测试就能发现的问题,而这种问题在集成时遇到往往很难让开发人员预料到,最后在苦苦寻觅中才发现这是个很低级的错误而在悔恨自己时已经浪费了很多时间,这种时间上的浪费一点都不值得,正所谓得不偿失。
-
测试效果:根据以往的测试经验来看,单元测试的效果是非常明显的,首先它是测试阶段的基础,做好了单元测试,在做后期的集成测试和系统测试时就很顺利。其次在单元测试过程中能发现一些很深层次的问题,同时还会发现一些很容易发现而在集成测试和系统测试很难发现的问题。再次单元测试关注的范围也特殊,它不仅仅是证明这些代码做了什么,最重要的是代码是如何做的,是否做了它该做的事情而没有做不该做的事情。
-
测试成本:在单元测试时某些问题就很容易发现,如果在后期的测试中发现问题所花的成本将成倍数上升。比如在单元测试时发现1个问题需要1个小时,则在集成测试时发现该问题需要2个小时,在系统测试时发现则需要3个小时,同理还有定位问题和解决问题的费用也是成倍数上升的,这就是我们要尽可能早的排除尽可能多的bug来减少后期成本的因素之一。
-
产品质量:单元测试的好与坏直接影响到产品的质量,可能就是由于代码中的某一个小错误就导致了整个产品的质量降低一个指标,或者导致更严重的后果,如果我们做好了单元测试这种情况是可以完全避免的。
-
语句覆盖(StatementCoverage):也称为行覆盖(linEC),段覆盖(segmentcoverage)和基本块覆盖(bAS)。它度量每一个可执行语句是否被执行到了。
-
判定覆盖(DecisionCoverage):也被称为分支覆盖(branchcoverage),所有边界覆盖(all-edgescoverage),基本路径覆盖(basispathcoverage),判定路径覆盖(decision-decision-path或DDPtesting)。它度量是否每个BOO型的表达式取值true和false在控制结构中都被测试到了。L
-
条件覆盖(ConDI):它独立的度量每一个子表达式,报告每一个子表达式的结果的true或false。这个度量和判定覆盖(decisioncoverage)相似,但是对控制流更敏感。不过,完全的条件覆盖并不能保证完全的判定覆盖。
-
路径覆盖(PathCoverage):也称为断言覆盖(prEDI),它度量了是否函数的每一个可能的分支都被执行了。路径覆盖的一个好处是:需要彻底的测试。但有两个缺点:一是,路径是以分支的指数级别增加的,例如:一个函数包含10个IF语句,就有1024个路径要测试。如果加入一个IF语句,路径数就达到2048;二是,许多路径不可能与执行的数据无关。
-
循环覆盖(LOOP):这个度量报告你是否执行了每个循环体零次、只有一次还是多余一次(连续地)。对于do-while循环,循环覆盖报告你是否执行了每个循环体只有一次还是多余一次(连续地)。这个度量的有价值的方面是确定是否对于while循环和for循环执行了多于一次,这个信息在其它的覆盖率报告中是没有的。
-
调用所测模块时的输入参数与模块的形式参数在个数、属性、顺序上是否匹配;
-
所测模块调用子模块时,它输入个子模块的参数与子模块的形式参数在个数、属性、顺序上是否匹配;
-
是否修改了只做输入用的形式参数;
-
输出给标准函数的参数在个数、属性、顺序上是否匹配;
-
全局变量的定义在各模块中是否一致;
-
限制是否通过形式参数来传送。
-
检查不正确或不一致的数据类型说明;
-
使用尚未赋值或尚未初始化的变量;
-
错误的初始值或错误的默认值;
-
变量名拼写错误或书写错误;
-
不一致的数据类型。
-
常见的不正确的计算有:
-
常见的比较和控制流错误有:
-
出错的描述难以理解;
-
出错的描述不足以对错误定位和确定出错的原因;
-
显示的错误与实际的错误不符;
-
对错误条件的处理不正确;
-
在对错误进行处理之前,错误条件已经引起系统的干预;
-
如果出错情况不予考虑,那么检查恢复正常后模块可否正常工作。
-
在n次循环的第0次、1次、n次是否有错误;
-
运算或判断中取最大最小值时是否有错误;
-
数据流、控制流中刚好等于、大于、小于确定的比较值时是否出现错误。
-
驱动模块(Driver):所测模块的主程序。它接收测试数据,把这些数据传递给所测试模块,最后再输出测试结果。当被测试模块能完成一定功能时,也可以不要驱动模块。
-
桩模块(Stub):用来代替所测模块调用的子模块。
-
用例运行前置条件
-
被测模块/单元所需环境(全局变量赋值或初始化实体)
-
启动测试驱动
-
设置桩
-
调用被测模块
-
设置预期输出条件判断
-
恢复环境(包括清除桩)
-
一个好的测试用例在于能够发现至今没有发现的错误;
-
测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成;
-
在测试用例设计时,应当包含合理的输入条件和不合理的输入条件;
-
为系统运行起来而设计测试用例;
-
为正向测试而设计测试用例;
-
为逆向测试而设计测试用例;
-
为满足特殊需求而设计测试用例;
-
为代码覆盖而设计测试用例;
-
每个确定语句的每一个方向要测试到;
-
每条语句最少执行一次。
-
循环不执行;
-
执行一次循环;
-
执行两次循环;
-
反映执行典型的循环的执行次数;
-
如果有最大循环次数,最大循环次数减1;
-
最大循环次数;
-
大于最大循环次数。
-
把外循环设置为最小值,并运行内循环所有可能的情况;
-
把内循环设置为最小值,并运行外循环所有可能的情况;
-
把所有的循环变量都设置为最小值运行;
-
把所有的循环变量都设置为最大值运行;
-
把外循环设置为最大值,并运行内循环所有可能的情况;
-
把内循环设置为最大值,并运行外循环所有可能的情况;
-
程序的执行过程―――便于构造发散用例
-
不要放过任何细节―――这种细节可能就是问题
1、测试用例的优化
2、测试执行的优化
-
哪些是重点模块?
-
哪些程序是最复杂、最容易出错的?
-
哪些程序是相对独立,应当提前测试的?
-
哪些程序最容易扩散错误?
-
哪些程序是开发者最没有信心的?
-
80-20原则:80%的缺陷聚集在20%的模块中,经常出错的模块改错后还会经常出错,这种应该列入测试重点。
-
不可能的路径或条件
-
不可达的或冗余的代码
-
不充分的测试用例
-
功能覆盖
-
输入域覆盖
-
输出域覆盖
-
函数交互覆盖
-
代码执行覆盖
-
系统分析设计人员
-
软件开发人员
-
软件测试人员
-
配置管理人员
-
质量保证(QA)人员
-
《软件需求规格说明书》
-
《软件详细设计说明书》
-
《软件编码与单元测试工作任务书》
-
《软件集成测试计划》
-
《软件集成测试方案》
-
用户文档
-
《单元测试计划》
-
《单元测试方案》
-
《需求跟踪说明书》或需求跟踪记录
-
代码静态检查记录
-
《正规检视报告》
-
问题记录
-
问题跟踪和解决记录
-
软件代码开发版本
-
《单元测试报告》
-
《软件编码与单元测试任务总结报告》
-
精心制定测试计划
-
严格评审测试计划
-
严格执行测试计划
-
系统分析测试结果并提交报告
-
脚本化测试驱动
-
脚本桩
-
在线测试
-
即时调测
-
测试工程管理
-
即时测试类/函数
-
支持极端编程模式下的代码测试
-
自动建立类/函数的测试驱动程序和桩调用
-
自动建立和执行类/函数的测试用例
-
提供快速加入和执行说明和功能性测试的框架
-
执行自动回归测试
-
执行部件测试(COM)