第七章软件结构的健壮性——测试与测试优先编程

1. 软件测试(Software Test)

测试:发现程序中的错误,提高程序正确性的信心。

程序确认的基本方法:

  • 形式化推理(Formal reasoning)
  • 代码评审(Code review)
  • 测试(Testing)

为什么要测试?

  • 提高软件质量的重要手段
  • 确认是否达到可用的级别(用户需求)
  • 关注系统的某一个侧面的质量特性
  • 是否满足需求spec(正确性)
  • 是否能够正确相应所有可能的需求(正确性、健壮性)
  • 性能是否可接受(正确性)
  • 是否可用(正确性、健壮性)
  • 是否正常部署和运行(正确性)
  • 是否达到预计期望(正确性)

这里要提一个概念——残留缺陷率(residual defect rates),有点抽象哈,说下它的单位应该就好很多了,他的单位是每千行代码有多少缺陷,至于缺陷是导致bug的根源,可以理解为每千行代码有多少潜在bug。不用说,这是用来衡量代码质量的,1~10defects/kloc这是典型的工业软件的指标,而0.1~1defect/kloc这是高质量的标准,java标准库也就是这个标准。0.01~0.1defecs/kloc是严格安全的标准,NASA等采用的也就是这个级别。然而即使是这最严格的标准,一百万行代码也会有1000个bugs!

测试跟其他活动的目标相反:破坏、证错、“负能量”,再好的测试也无法证明系统中不存在任何错误。

那么衡量一个优等测试的标准有哪些?

  • 能发现错误
  • 不冗余
  • 最佳特性
  • 别太复杂也别太简单

在测试中也分为三个级别:

  • 单元测试(Unit testing):验证代码段特定功能的测试,是在功能阶段上的等级
  • 集成测试(Integration testing):合并被多个开发团队开发的两个或更多的类、包、组件、子系统的测试。
  • 系统测试(System testing):测试一个完全集成的面对需求的系统。

嘛,这是理想的,还有……


哼哼,测到你崩溃。


现在说一下测试与调试的区别吧:(或许给出英文大家就理解了)

  • 测试(Test)用于发现是否存在错误
  • 调试(debug)识别错误根源,消除错误

黑盒测试与白盒测试区别:

  • 黑盒测试:对程序外部表现出来的行为的测试
  • 白盒测试:对程序内部代码结构的测试


软件测试不是一项简单的工作,首先穷举各种情况impossible,靠偶然测试有没有意义,基于样本的统计数据对软件测试的意义不大-软件与产品的巨大差异。与此同时,软件行为在离散输入空间中差异巨大,往往bug出现不符合特定的概率分布,无统计分布规律可寻。



2.测试用例(Test Case)

测试用例组成:输入+执行条件+期望结果。

优秀的测试用例指标:

  • 最可能发现错误
  • 不重复、不冗余
  • 最有效
  • 既不复杂也不简单


3.测试优先编程(Test-First Programming)

测试优先编程流程:

  • 写spec
  • 在写符合spec的测试用例
  • 写代码、执行测试、有问题在修改、在执行测试用例、直到通过测试用例

这样会节省大量的测试时间!



4. 黑盒测试

黑盒测试:用于检查代码的功能,不关心内部实现细节。其目的是检查程序是否符合规约,最好用最可能少的测试用例,尽快运行,并尽可能大的发现程序的错误。

A.通过划分选择测试用例:

基于等价类划分的测试:将被测函数的输入域划分为等价类,从等价类中导出测试用例。

我们可以针对每个输入数据需要的约束条件,划分等价类,对于每个等价类代表着对输入约束加以满足/违反的有效/无效数据集合。




B.涵盖边界情况在划分中

大量的错误发生在输入域的边界情况上,所以要对边界值进行分析,其是对等价类划分方法的补充。在等价类划分时,应该讲边界作为等价类之一加以考虑。而且不仅要考虑边界,还要考虑边界两侧。

多个维度等价类划分…………笛卡尔乘积实现全覆盖!(肝吧!)



5.白盒测试

黑盒测试中完全从函数spec导出测试用例,不需要考虑函数内部的实现,而白盒测试则需要考虑内部的实现细节。其需要根据程序执行路径设计测试用例,白盒测试也一般较早的执行。

来个流程图吧:


其要求是独立/基本路径的测试:对程序所有的执行路径进行等价类划分,找出有代表性的最简单的路径,设计测试用例使每一条基本路径最少被覆盖一次。(下面会说到代码覆盖度,其实指的就是这个……)


6.测试覆盖度(Coverage of Testing)

代码覆盖度:已有的测试用例有多大比例覆盖了被测程序。

如果代码覆盖度越低,测试越不充分,但要做到很高的代码覆盖度需要更多的测试用例,测试代价很高。代码覆盖度主要包括函数覆盖、语句覆盖、分支覆盖、条件覆盖和路径覆盖。

从测试效果来看:路径覆盖>分支覆盖>语句覆盖,从测试难度来看也是一样的。所以实际中,一般会预定好覆盖度标准,大多数为语句覆盖100%,路径覆盖90%


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值