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%