代码覆盖的15种典型情景-2

上一篇 / 下一篇  2012-10-26 14:17:50 / 个人分类:杂谈

51Testing软件测试网:U)n*R R.bE

  10、被拒绝的馈赠51Testing软件测试网.V$yL2c!}jRtB

51Testing软件测试网$g hob2j+tG.q | T-Vl;X

  在接口/抽象类定义的时候,有时候定义的一些方法子类并没有都实现,即常说的被拒绝的馈赠(Refused Bequest),这种问题如果是为了短期扩展需求多加了一些方法也可接受,否则还是需要重新继承体系设计。

2rG C i!uTV051Testing软件测试网Y}#OnK

  提示:子类未使用“馈赠”,无需覆盖,需重新审视继承体系结构。

x0O}T*a;e1im W051Testing软件测试网.QN%_O8cm a u

  11、代码覆盖工具未做合并

_j_&@c6K2jI0

u_:xqD`fg0  做代码覆盖时,往往工具本身不支持“合并”的功能,这导致以下问题存在:51Testing软件测试网8^y| SP tT

51Testing软件测试网iy5Q8Eae,b4{i

  时间上:

u@@ R,cJ j H6}0

Wh_+C ^W9k0  例如对于拥有cache的系统: 系统经过一段时间运行后,重新测试得到的代码覆盖往往不包括cache miss的情况。51Testing软件测试网BN#CQ;y(^\*Y(qP4`

0g5@fT1~'n0  手工测试问题:每次统计都需要重新完成全部手工测试,否则将丢失数据。

)?x-N5t!GI,W051Testing软件测试网 w[6eN&zQ

  空间上:

t;W:fS'z0

BU \A'YS7P%p9z0  负载均衡:现在大多系统应用都采用负载均衡技术,如果测试时间不够长且只统计一台系统的代码覆盖情况,往往不全面。

,DNz+Ni6{+{0

{ N'ruO&i"F p3r0  提示:代码覆盖本身要支持“合并”功能,对多个系统、不同时间的数据进行合并,才能覆盖的完整全面。

Dr*? t5Q:ac1o5H051Testing软件测试网 qe`x un

  12、系统逻辑重复

'D!~` c h/N(TW0

&k:Ekv0D5b0  这里可分为两种情况:

FMv8ES-@4Z051Testing软件测试网^DT ~+W0O!jVGQo

  组件之间重复:上层系统可能会对数据合法性做检验,但是下层系统出于系统的独立性目标,也可能对数据做二次校验,但是作为一个完整系统进行end-to-end测试时,就无法覆盖二次校验的代码;针对这种情况,需要拆开成独立组件进行测试。

+W#D.c q1V3r,J]1e0

vC9w6qR8z zWT0  组件内部重复:同一组件内多层重复逻辑确实可以纠正代码,例如在对于某个数据做多次同一类型校验,这种问题常出现于多人协同编码又缺乏沟通的情况中。

8_T:HL"n1mr5Q0

xx7uBI)vWM0  提示:逻辑重复导致的部分未覆盖要分辨是组件之间还是组件内部冗余,组件之间则需要覆盖,组件内部则要修改代码。

j0v(J}:i;z0

$Ips?Uv1T F*Xu"}-K0  13、代码写法

rR+W%}UR3?;r051Testing软件测试网6@;j{ Q/o

  有时候某些代码的写法,也会导致无法覆盖,例如对于代码调用顺序:多个类调用读取配置文件,而稍晚些调用的再次判断配置文件是否初始化,自然为已初始化。再如对于单例,某些代码写成这样:51Testing软件测试网/i9Y1u Q"{\f%n ~g

}J K?UNG0

lY&g.U%fw]H0

-Hk X\ [ F+H0private static SingleInstance INSTANCE = new SingleInstance();

!W(r D@s%dH051Testing软件测试网$?p7@5P"t7}

public static SingleInstance getInstance() {
lV*g(~/n6{5i0        if (INSTANCE == null) {51Testing软件测试网~ WE7N`!]
            INSTANCE = new SingleInstance();51Testing软件测试网$]VC$H%SzHM!x
        }
U?^ZK0        return INSTANCE;51Testing软件测试网V#PI L!s vc
}
51Testing软件测试网9[ w3Vun!|ZP

51Testing软件测试网[GS-?6Bq9\ekM

  提示:代码写法造成的未覆盖,需要审查下是代码问题。51Testing软件测试网+|1T%T J4f)upv u

7[8ib6R u4W8E;C}p9U$I*F0  14、隐式的分支51Testing软件测试网/vy.zKU0LG5Z

51Testing软件测试网 Un{OX*Vi p

  当代码中含有隐式的分支时,往往很难100%覆盖,例如上文提到的断言assert,貌似只有一句,但是即使启用断言仍然无法100%覆盖,例如下例还是显示黄色:分支未覆盖。

]){!}J~'@?0

#p5G.t$Kha7p'T@'`,PB051Testing软件测试网u1{Z'M m5a

;uT?*m)R0public class AssertCodeCoverage {

l6b_6n iWlI\0

n)y oJD#{AM)t:R0        public void verify(Boolean b) {51Testing软件测试网M4{V x~9D[1pA
         assert b;
iW:w N G{FO)t0        }
51Testing软件测试网)eP3F!@)Mt)YK

51Testing软件测试网-Jr9zZu~7a)]f.X

}

]8QY8\` {F0

bK;iZ%zS(X5gq0  究其原因,查看编译后的class可知,存在第三条指令:判断是否启用断言。在实际应用中,要么启用要么关闭,所以不可能覆盖所有分支。只能说启用断言,或许能提高指令覆盖率,下图为启用及关闭断言的覆盖率对比:

!SQC t3f0

51Testing软件测试网vs0w P/j*jQ

$m7NCaL*j$J0
public void verify(java.lang.Boolean b);
*n[h3U(X.ra00  getstatic com.test.coverage.AssertCodeCoverage.$assertionsDisabled : boolean [16]51Testing软件测试网!Sv7`o We
3  ifne 2151Testing软件测试网f6}%~ Z+V6H {M7PL
6  aload_1 [b]
P9Rf A)oi3i Z07  invokevirtual java.lang.Boolean.booleanValue() : boolean [28]51Testing软件测试网b ]{ Z!]os#u+M
10  ifne 21
Xl6h? z*q%t5lI)n013  new java.lang.AssertionError [33]51Testing软件测试网L3YE&u4?TN'B1E
16  dup
'@5n,Jl&C'}@017  invokespecial java.lang.AssertionError() [35]51Testing软件测试网g6F l7Vs]6?
20  athrow
;sW(E Q Z021  return51Testing软件测试网3J+k:lIF+nv4q$fv({
}

51Testing软件测试网 [1br PB3C$kg

0x9aifne当栈顶int型数值不等于0时跳转。

  因此,从这个角度来说,想覆盖断言,不仅要关闭断言完成测试用例,还要在开启断言情况下完成测试。51Testing软件测试网NY,B\2F#l&VPs E^

  提示:隐式的分支(黄色)需要分析未覆盖分支。51Testing软件测试网 r)?wT E

  15、不在覆盖范围内

0H2pQ*FQ$D9u8p^hMs0

  下面两种类型的代码不在代码覆盖统计范围内:

+S pYAw0

  1)Java接口,接口里面都是抽象方法的结合,不含有任何代码细节;

,r-bv-B:G |x0

  2)不含有可执行java字节码的方法:抽象方法和本地native方法。

)c2k3V4B6F e}s0

;Q_?IwB7Vz0

8o ~ Jd:je:ol0abstract class AbstractService {
Y&ndz boJ7OVM0        abstract String getString();  //不做统计
.PdolR0        String getName() {  return getString().trim();    }
jG3DQd0}

H`YqDg1w}w;s051Testing软件测试网H9c9ab@O8Ay#d

public class BaseService extends AbstractService {51Testing软件测试网EUU m5WR-x
        @Override
bP"u3i9mW0        String getString() {      return "zookeeper";    }51Testing软件测试网o)Bbl'cC LIk)^
}
51Testing软件测试网?-FR!z*HyMq

  提示:不在统计范围内的直接忽视。51Testing软件测试网~i5nbwy!uY2F

  小结:51Testing软件测试网i#?t-T&Ic

  通过对上面15种典型情况的概括,相信大家对代码覆盖的常见情景已有大概印像,在实际分析中,可以按照以下规则进行:51Testing软件测试网/p;U"W2y9^3X5lzl

  1)内容:包->类->方法->代码;

r}#}#@t)eAK1yg0

  2)优先级: 核心业务类->普通业务类->工具助手类->常量类;51Testing软件测试网a,GA6Y~Y_%z:w n

  经过不断的分析和推敲,相信大家得到的不仅是一个较高的代码覆盖率,更是对代码质量的一份信心。51Testing软件测试网1UljUjF1W-p


TAG:

 

评分:0

我来说两句

Open Toolbar