软件测试
目的:发现程序中的问题,从而提高程序员对程序正确性的信心
程序正确性确认的基本方法
什么是测试
测试提高软件质量的重要手段,执行程序或应用程序的过程,目的是发现错误(错误或其他缺陷),并验证软件产品是否适合使用。确认是否达到可用级别(用户需求),它关注系统的某一侧面的质量特性,一般来说,这些属性表示正在测试的组件或系统的程度
特征
测试的目标
测试的层次
测试的分类
静态测试:在不实际执行程序的情况下执行的,通常是隐式的,比如校对,当编程工具/文本编辑器检查源代码结构时,检查语法和数据流作为静态程序分析。
动态测试:描述的是对代码动态行为的测试,实际上实在给定的测试集上运行程序
白盒测试:对程序内部代码结构的测试
黑盒测试:对程序外部表现出来的行为的测试
为什么软件测试很难
穷举测试是不可行的:可能的测试用例的空间通常太大,无法面面俱到。
随意测试(“尝试一下,看看它是否有效”)不太可能发现bug。
随机或统计测试对软件不起作用。
软件行为在可能的输入空间不连续变化。
测试无统计分布规律可循
测试案例
通常是一个步骤,或者偶尔是一系列步骤,用来测试应用程序的正确行为/功能、特性。通常会给出预期的结果或预期的结果。好的测试案例的特征:最可能发现错误,不重复也不冗余,有效,不简单也不复杂
设计准则:
代表性:测试案例可以代表和涵盖各种合理的、不合理的、合法的、非法的、边界和跨国界的、极端的输入数据、操作和环境设置等
测试优先的编程
在编写代码之前编写测试。
动机:使程序失败,并且失败的很快。当你有一大堆的测试案例时,不要将测试留到最后。把测试留到最后只会使调试变得更长和更痛苦,因为bug可能在代码中的任何地方。
单元测试
针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试,隔离测试使模块调试更加容易,当一个模块的单元测试失败时,可以很容易发现该模块中的错误,而不需要在程序中的任何地方找。
局部数据结构,确保在算法执行的过程中,数据结构保持完整
所有独立的路径,确保程序中的每一条语句都得以执行
边界条件,确保模块在限制或者限制处理的边界上正常运行
所有错误处理途径。
黑盒测试
划分等价类
等价划分是一种测试方法,将程序的输入域划分为多个数据类,从中选择测试用例的数据;针对每个输入数据需要满足的约束条件,划分等价类;每个等价类代表着对输入约束加以满足/违反的有效 /无效数据的集合
例如
BigInteger.multiply
函数的功能:BigInteger X BigInteger --> BigInteger
函数输入: 二维空间中的一个点
考虑输入数据的特殊情况:
0, 1, -1
考虑输入的上下限
带边界值的等价类划分
原因:大量的错误都发生在输入的边界而不是中央。比如某些边界值是特殊情况,需要特殊处理,程序的行为在边界的地方可能发生突变
例如
max()
等价类划分
考虑输入两个数之间的关系:大于,等于和小于
考虑输入两个数的值
两个覆盖划分的方法
全覆盖:在多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例。测试完备,但测试用例多,测试代价高
部分覆盖:每个维度的每个取值至少被一个测试用例覆盖一次即可,测试用例少,代价地,但测试覆盖度未必高