为了提升开发人员的代码质量,编写高质量的单元测试,要遵照3R(Responsible, Reliable, Repeative)原则,具体含义以下:数据结构
Responsible: 谁开发谁负责测试,在哪里开发就在哪里测试。单元测试
Reliable: 测试case要可靠,而且是值得信赖的,对于底层的任何改动都要可以及时感知。测试
Repeative: 全部单元测试用例都要可以重复运行。可以重复运行就可以进行回归测试、覆盖率统计等等。spa
通常来讲,单元测试任务包括:插件
(1)好比变量有无初始值设计
(2)变量是否溢出对象
(1)变量没有赋值(即为NULL)接口
(2)变量是数值(或字符)ip
a.主要边界:最小值,最大值,无穷大(对于DOUBLE等)开发
b.溢出边界(指望异常或拒绝服务):最小值-1,最大值+1
c.临近边界:最小值+1,最大值-1
(3)变量是字符串
a.引用"字符变量"的边界
b.空字符串
c.对字符串长度应用"数值变量"的边界
(4)变量是集合
a.空集合
b.对集合的大小应用"数值变量"的边界
c.调整次序:升序、降序
(5)变量有规律
a.好比对于Math.sqrt,给出n^2-1,和n^2+1的边界
四、全部独立执行通路测试:保证每一条代码,每一个分支都通过测试
(1)代码覆盖率
a.语句覆盖:保证每个语句都执行到了
b.断定覆盖(分支覆盖):保证每个分支都执行到
c.条件覆盖:保证每个条件都覆盖到true和false(即if、while中的条件语句)
d.路径覆盖:保证每个路径都覆盖到
(2)相关软件
a.Cobertura:语句覆盖
b.Emma: Eclipse插件Eclemma
五、各条错误处理通路测试:保证每个异常都通过测试
单元测试用例在设计和数据准备的过程当中,须要保持良好的独立性,确保本测试的数据是不须要依赖其余输出的,这样减小相互影响。
在测试用例设计的过程当中,尤为是测试用例编写在代码编写完成后进行的,必定当心被代码实现功能所影响,多考虑异常分支和异常数据。
面向对象的语言进行单元测试还有必定的特色,对于每个类,可能他出如今程序中的状况各不相同,在进行测试的时候,能够结合上面介绍的方法,根据内部方法相互调用逻辑,完成测试设计。
大致划分两个方向,一个是功能性的,就是相似黑盒的方法,仅仅关注实现的功能点是否正确;另外一个就是结构性测试,须要分析类中的方法相互实现逻辑,进行相似白盒测试,确保每一个分支覆盖。
使用断言而不是Print语句许多新手开发人员习惯于在每行代码以后编写System.out.println语句来验证代码是否正确执行。这种作法经常扩展到单元测试,从而致使测试代码变得杂乱。除了混乱,这须要开发人员手动干预去验证控制台上打印的输出,以检查测试是否成功运行。更好的方法是使用自动指示测试结果的断言。
除了正面情景,还要测试负面情景和边缘状况一般,开发人员会花费大量的时间和精力编写测试用例,以确保应用程序按预期工做。然而,测试负面测试用例也很重要。负面测试用例指的是测试系统是否能够处理无效数据的测试用例。
构建具备肯定性结果的测试,一些方法不具备肯定性结果,即该方法的输出不是预先知道的,而且每一次均可以改变,为该方法编写测试用例不会有任何用处。