测试分类
单元测试:白盒测试|开发人员测试|方法测试|单类测试
集成测试:灰盒测试|开发人员测试|类关联测试|模块测试
系统测试:黑盒测试|开发人员测试|模块集成测试|功能测试|端到端测试|
验收测试:黑盒测试|客户测试|功能测试|端到端测试|交互测试|可用性测试|性能测试|压力测试
测试环境
Dev环境测试: 单元测试|集成测试
Intg环境测试:单元测试|集成测试|系统测试|验收测试
Test环境测试:系统测试|验收测试
Prod环境测试:验收测试
测试过程
1) 明确当前要完成的功能。可以记录成一个 TODO 列表。
2) 快速完成针对此功能的测试用例编写。
3) 测试代码编译不通过。
4) 编写对应的功能代码。
5) 测试通过。
6) 对代码进行重构,并保证测试通过。
7) 循环完成所有功能的开发。
测试原则
测试隔离。不同代码的测试应该相互隔离。对一块代码的测试只考虑此代码的测试,不要考虑其实现细节(比如它使用了其他类的边界条件)。
一顶帽子。开发人员开发过程中要做不同的工作,比如:编写测试代码、开发功能代码、对代码重构等。做不同的事,承担不同的角色。开发人员完成对应的工作时应该保持注意力集中在当前工作上,而不要过多的考虑其他方面的细节,保证头上只有一顶帽子。避免考虑无关细节过多,无谓地增加复杂度。
测试列表。需要测试的功能点很多。应该在任何阶段想添加功能需求问题时,把相关功能点加到测试列表中,然后继续手头工作。然后不断的完成对应的测试用例、功能代码、重构。一是避免疏漏,也避免干扰当前进行的工作。
测试驱动。这个比较核心。完成某个功能,某个类,首先编写测试代码,考虑其如何使用、如何测试。然后在对其进行设计、编码。
先写断言。测试代码编写时,应该首先编写对功能代码的判断用的断言语句,然后编写相应的辅助语句。
可测试性。功能代码设计、开发时应该具有较强的可测试性。其实遵循比较好的设计原则的代码都具备较好的测试性。比如比较高的内聚性,尽量依赖于接口等。
及时重构。无论是功能代码还是测试代码,对结构不合理,重复的代码等情况,在测试通过后,及时进行重构。
小步前进。软件开发是个复杂性非常高的工作,开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的。极限编程提出了一个非常好的思路就是小步前进。把所有的规模大、复杂性高的工作,分解成小的任务来完成。对于一个类来说,一个功能一个功能的完成,如果太困难就再分解。每个功能的完成就走测试代码-功能代码-测试-重构的循环。通过分解降低整个系统开发的复杂性。这样的效果非常明显。几个小的功能代码完成后,大的功能代码几乎是不用调试就可以通过。一个个类方法的实现,很快就看到整个类很快就完成啦。本来感觉很多特性需要增加,很快就会看到没有几个啦。你甚至会为这个速度感到震惊。
测试用例
操作过程尽量模拟正常使用的过程。
全面的测试用例应该尽量做到分支覆盖,核心代码尽量做到路径覆盖。
测试数据尽量包括:真实数据、边界数据。
测试语句和测试数据应该尽量简单,容易理解。
为了避免对其他代码过多的依赖,可以实现简单的桩函数或桩类(Mock Object)。
如果内部状态非常复杂或者应该判断流程而不是状态,可以通过记录日志字符串的方式进行验证。
测试类型
Unit Testing<Integration Testing<Functional/System Testing<Stress/Load Testing<Acceptance Testing
测试方向
笼统:正常测试和反向测试
细分:Right-BICEP
Right 正向测试
用正确的数据
B 边界条件
一致性 数据是否符合规定的格式
有序性 数组或集合数据的顺序
范围,区间性 值是否存在于一个最大值和一个最小值之间
引用,耦合性 代码是否引用了一些不受代码控制的外部因素
存在性 固定的测试,如null,empty,非零等
基数性 原则“0-1-N”
时间性 是否按时间顺序执行,是否在正的时间执行,是够出现执行事情延误了
I 反向关联
C 交叉检查
E 强制产生错误
P 性能特性
测试内容
单元测试任务包括
接口功能测试:用来保证接口功能的正确性。
局部数据结构测试(不常用):用来保证接口中的数据结构是正确的
比如变量有无初始值
变量是否溢出
边界条件测试
变量没有赋值(即为NULL)
变量是数值(或字符)
主要边界:最小值,最大值,无穷大(对于DOUBLE等)
溢出边界(期望异常或拒绝服务):最小值-1,最大值+1
临近边界:最小值+1,最大值-1
变量是字符串
引用“字符变量”的边界
空字符串
对字符串长度应用“数值变量”的边界
变量是集合
空集合
对集合的大小应用“数值变量”的边界
调整次序:升序、降序
变量有规律
比如对于Math.sqrt,给出n^2-1,和n^2+1的边界
所有独立执行通路测试:保证每一条代码,每个分支都经过测试
代码覆盖率
语句覆盖:保证每一个语句都执行到了
判定覆盖(分支覆盖):保证每一个分支都执行到
条件覆盖:保证每一个条件都覆盖到true和false(即if、while中的条件语句)
路径覆盖:保证每一个路径都覆盖到
各条错误处理通路测试:保证每一个异常都经过测试
相关软件
Cobertura:语句覆盖
Emma: Eclemma(Eclipse Plugin)
Jacoco
来源:oschina
链接:https://my.oschina.net/u/98127/blog/639167