软件测试与测试优先的编程
什么是测试?
软件测试是提高软件质量的重要手段,有助于发现 bugs, 确认是否达到可用级别 ( 用户需求 ),并且关注系统的某一侧面的质量特性。即使是最好的测试,也无法达到 100%的无错误率。通常使用残留缺陷率(单位:defects/kloc)来表示。 再好的测试也无法证明系统里不存在错误。
什么是好的测试?
1.能发现错误
2.没有冗余
3.具有几个测试方案中最好的特性
4.别太复杂也别太简单
测试等级
单元测试: 指的是验证特定代码部分的功能,通常位于功能级别。
集成测试: 两个或多个的联合执行由创建的类、包、组件、子系统多个程序员或编程团队。
系统测试: 测试一个完全集成的系统验证系统是否满足其要求,从而执行软件的最终配置。
回归测试:重复上述过程
静态与动态测试:静态测试通常是隐含的,如校对,以及编程时工具/文本编辑器检查源代码结构或编译器(预编译器)将语法和数据流检查为静态程序分析。动态测试可以在程序按顺序100%完成之前开始测试代码的特定部分,并应用于离散函数或模块。
测试与调试:测试用于发现是否存在错误,调试用于识别错误根源消除错误
白盒与黑盒测试:白盒测试是对内部代码与结构模块的测试,黑盒测试仅测试外部表现的功能
为什么软件测试很难?
因为暴力穷举不可能,仅靠偶然的个例测试没有太大意义,必须有严密的逻辑进行全面测试。软件行为在离散空间中差异巨大,分布不均匀,错误通常都是极少数,没有分布规律
什么是测试用例
目的是测试优先的编程,节省调试时间。包含输入,执行条件,期望结果。好的测试用例能够有效发现错误,不冗余,最有效,不简单也不复杂。测试用例:输入 + 执行条件 + 期望结果
测试优先的编程
当你有一大堆未经验证的东西时,不要把测试留到最后,将测试留到最后只会使调试时间更长而且更痛苦,因为bug可能在代码中的任何位置。对于每段代码,写代码、执行测试、有问题再改、再执行测试用例,直到通过它。同时先写测试会节省大量的调试时间
优先测试的好处
1.越早发现越容易纠正
2.更深入和更早的理解需求和设计
3.更早地暴露需求和设计的问题
4.可确保程序的可测试性
5.确保每个程序的特征测试都编写完成
6.先于编码之前写测试不会占用额外的时间
单元测试
单元测试针对软件的 最小单元模型开展测试,隔离各个模块,容易定位错误和调试
单元测试要求:做接口测试输入输出,数据的一致性,所有语句均被执行到
使用JUnit进行自动化单元测试
是一个用于Java编程语言的单元测试框架,用于编写和运行自动化单元测试。它是软件开发中最广泛使用的单元测试框架之一,具有简单易用、灵活性强等特点。
黑盒测试
黑盒测试是一种软件测试方法,用于检查应用程序的功能,而无需窥探其内部结构或工作。
黑盒测试试图发现以下类型中的错误:不正确或缺失的函数,接口错误,数据结构或外部数据库访问中的错误,行为或性能错误,初始化和终止错误
测试用例选择
等价类划分:基于等价类划分的测试:将被测函数的输入域划分为等价类,从等价类中导出测试用例;针对每个输入数据需要满足的约束条件,划分等价类
边界值分析:大量的错误发生在输入域的“边界”而非中央。边界值分析(BVA)已经发展成为一种测试技术,导致了对边界值的测试用例的选择。是对等价类划分方法的补充。可选的策略有笛卡尔积,通过遍历达到全覆盖但代价高;每个取值一次即可,覆盖度未必高。
白盒测试
白盒测试要考虑内部实现细节,从系统的内部视角,以及编程技能,用于设计测试用例。
测试人员通过代码和确定适当的输出。根据程序执行路径设计测试用例
白盒测试可以应用于单元、集成和软件测试过程的系统级。一般来说,它是在测试过程的早期执行
代码覆盖度
指的是已有的测试用例有多大程度覆盖了被测程序。具有高代码覆盖率的程序,通常用百分比衡量覆盖度,代码覆盖度越低,测试越不充分但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高。
判断测试套件的一种方法是询问它对程序的操作程度。这个概念被称为覆盖范围。
覆盖范围通常包括:函数覆盖,语句覆盖,分支覆盖,条件覆盖,路径覆盖
测试效果:路径覆盖 > 分支覆盖 > 语句覆盖
测试难度:路径覆盖 > 分支覆盖 > 语句覆盖
自动化测试和回归测试
手工测试的代价太高,最好达到完全的自动化。自动测试自动调用被测函数、自动判定测试结果、自动计算覆盖度。回归测试指一旦程序被修改自动执行之前做过的测试
记录测试策略
测试策略(根据什么来选择测试用例)非常重要,需要在程序中显式记录下来
目的:在代码评审过程中,其他人可以理解你的测试,并评判你的测试是否足够充分