软件构造之测试

软件测试

目的:发现程序中的问题,从而提高程序员对程序正确性的信心

程序正确性确认的基本方法
形式化推理:验证构造程序正确的形式证明。单调乏味的手工操作,需要自动化工具
代码评审:让别人仔细阅读你的代码,是发现错误的好方法
测试:在仔细选择的输入上运行程序并检查结果

 

什么是测试

测试提高软件质量的重要手段,执行程序或应用程序的过程,目的是发现错误(错误或其他缺陷),并验证软件产品是否适合使用。确认是否达到可用级别(用户需求),它关注系统的某一侧面的质量特性,一般来说,这些属性表示正在测试的组件或系统的程度

correctness 是否满足需求spec
correctness,robustness 是否正确的响应所有可能的需求
correctness 性能是否可接受
correctness, robustness 是否可用
correctness 可否正确的安装部署和运行
correctness 达到期望

即使是最好的测试,也无法达到100%的无错误
residual defect rates 残留缺陷率 (bugs left over after the software has shipped) per kloc  (1000 Lines of Code)

特征

测试的目标
测试的目标与其他开发活动的目标背道而驰,目标是 找出错误,再好的测试也无法证明系统里不存在错误
好的测试特点:
能发现错误
不冗余
具有最佳特性
既不复杂也不简单

测试的层次

单元测试:测试,验证一个特定的代码段的功能,通常在函数水平
集成测试:由多个程序员或编程团队创建的两个或两个以上的类,包,组件,系统的联合执行。
系统测试:测试一个完全集成的系统,验证系统满足其要求,在最终的配置上执行软件。

测试的分类

静态测试:在不实际执行程序的情况下执行的,通常是隐式的,比如校对,当编程工具/文本编辑器检查源代码结构时,检查语法和数据流作为静态程序分析。

动态测试:描述的是对代码动态行为的测试,实际上实在给定的测试集上运行程序

白盒测试:对程序内部代码结构的测试

黑盒测试:对程序外部表现出来的行为的测试


为什么软件测试很难

穷举测试是不可行的:可能的测试用例的空间通常太大,无法面面俱到。

随意测试(“尝试一下,看看它是否有效”)不太可能发现bug。

随机或统计测试对软件不起作用。

软件行为在可能的输入空间不连续变化。

测试无统计分布规律可循 


测试案例

通常是一个步骤,或者偶尔是一系列步骤,用来测试应用程序的正确行为/功能、特性。通常会给出预期的结果或预期的结果。好的测试案例的特征:最可能发现错误,不重复也不冗余,有效,不简单也不复杂

设计准则

代表性:测试案例可以代表和涵盖各种合理的、不合理的、合法的、非法的、边界和跨国界的、极端的输入数据、操作和环境设置等

决定性:测试结果的正确性是确定的,每个测试用例应该有相应的预期结果。
可重复性:对于相同的测试用例,系统实现的结果应该是相同的。

测试优先的编程

在编写代码之前编写测试。

动机:使程序失败,并且失败的很快。当你有一大堆的测试案例时,不要将测试留到最后。把测试留到最后只会使调试变得更长和更痛苦,因为bug可能在代码中的任何地方。

过程:先写spec,再写符合spec的测试用例,写代码、执行测试、有问题再改、再执行测试用例,直到通过它
 

单元测试

针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试,隔离测试使模块调试更加容易,当一个模块的单元测试失败时,可以很容易发现该模块中的错误,而不需要在程序中的任何地方找。

考虑
模块接口,确保信息正确的流入或者流出程序单元

局部数据结构,确保在算法执行的过程中,数据结构保持完整

所有独立的路径,确保程序中的每一条语句都得以执行

边界条件,确保模块在限制或者限制处理的边界上正常运行

所有错误处理途径。

黑盒测试
检查程序是否符合规约,测试用例一般源于软件的外部描述,包括规范、需求和设计参数。我们需要选择一组足够小的测试用例以快速运行,但足够大以验证程序的正确性

划分等价类

等价划分是一种测试方法,将程序的输入域划分为多个数据类,从中选择测试用例的数据;针对每个输入数据需要满足的约束条件,划分等价类;每个等价类代表着对输入约束加以满足/违反的有效 /无效数据的集合

等价类的思想是将输入空间划分为一组相似的输入,对于改组输入,程序运行具有相似的行为,所以可以使用集合的一个代表来代表整个集合。这种方法通过选择不同的测试用例,最大限度地利用有限的测试资源,并迫使测试探索随机测试可能无法达到的输入空间的一部分

例如

BigInteger.multiply

函数的功能:BigInteger  X  BigInteger -->  BigInteger

函数输入: 二维空间中的一个点

等价类划分

考虑输入数据的正负:
两个都是正数,两个都是负数,一个正数一个负数

考虑输入数据的特殊情况:

     0, 1, -1

考虑输入的上下限

最终结果


带边界值的等价类划分

原因:大量的错误都发生在输入的边界而不是中央。比如某些边界值是特殊情况,需要特殊处理,程序的行为在边界的地方可能发生突变

作用:对等价类划分方法的补充,不仅需要考虑边界,还需要考虑边界两侧

例如

max()

等价类划分

考虑输入两个数之间的关系:大于,等于和小于

考虑输入两个数的值

0,大于0,小于0,最大整数,最小整数

考虑输入数据的边界

 

两个覆盖划分的方法

全覆盖:在多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例。测试完备,但测试用例多,测试代价高

部分覆盖:每个维度的每个取值至少被一个测试用例覆盖一次即可,测试用例少,代价地,但测试覆盖度未必高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值