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

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

#T8[ s$x4N:W,i^&D0  10、被拒绝的馈赠

U&~;|PiihS3C6ZWB051Testing软件测试网A(yyJ*y0S)h(_)yw U$t

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

FC|)zG ~JHow9T0

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

H7j2nnc2{:Xe4t Fm0

4Ei#W-qv$VM5J!be0  11、代码覆盖工具未做合并

O:YtC*^Jw9Q-wH0

WQ'B A4I#J;b4SG0  做代码覆盖时,往往工具本身不支持“合并”的功能,这导致以下问题存在:51Testing软件测试网G5g8M\0I.T'OdO2}@

51Testing软件测试网U*XmX$GP\&h

  时间上:

H0z |GQ m0

0G)W8b%e1c m0  例如对于拥有cache的系统: 系统经过一段时间运行后,重新测试得到的代码覆盖往往不包括cache miss的情况。51Testing软件测试网Kx#L1R2Yjq

ehv?D/Ev0ZI0o+D0  手工测试问题:每次统计都需要重新完成全部手工测试,否则将丢失数据。

g'`:S r7^&X0

2A5s c va@;I6]~d0  空间上:51Testing软件测试网(ULvQ I6pg*L ?

51Testing软件测试网*@Q!E x|6E$ft-M

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

8O%v1m4cHH:H zJ051Testing软件测试网 R%T{ T!Pm6X;N

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

YA z.gc/~O051Testing软件测试网g[{3eY4X

  12、系统逻辑重复

r9Epr@V;q8m051Testing软件测试网%aVJ.xE,J({P(L4@+g

  这里可分为两种情况:51Testing软件测试网+Nr'fPdIy;WI2J

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

n'ct[!\0B0

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

%Lh8J$Cl Q~]*o [0

8}8v Q Iv:U0  提示:逻辑重复导致的部分未覆盖要分辨是组件之间还是组件内部冗余,组件之间则需要覆盖,组件内部则要修改代码。

U;r6X1f%D8C9_0

_U4t_S#E%p7s0  13、代码写法

MX_B-b0

[KDL"H&g;M_m0  有时候某些代码的写法,也会导致无法覆盖,例如对于代码调用顺序:多个类调用读取配置文件,而稍晚些调用的再次判断配置文件是否初始化,自然为已初始化。再如对于单例,某些代码写成这样:

s~&EjC-YD051Testing软件测试网a? T\`2`

![Od]-dz n/L0

N!s8nw4U5S;P0private static SingleInstance INSTANCE = new SingleInstance();

R-hUH.A-h0

5Nx%b8t7Yf aIc0public static SingleInstance getInstance() {51Testing软件测试网Sjqp-`6a7m$v C
        if (INSTANCE == null) {51Testing软件测试网oKaTP4O0u
            INSTANCE = new SingleInstance();
-Oky`;Y,U0        }51Testing软件测试网eJ-PK2cSQ
        return INSTANCE;51Testing软件测试网!np rIrZob}
}
51Testing软件测试网D"_z.FK A0H8@a

51Testing软件测试网8{SSz`Z"yx

  提示:代码写法造成的未覆盖,需要审查下是代码问题。51Testing软件测试网&C~^Z7K0V0u

51Testing软件测试网-UoC/`YWk7l#U

  14、隐式的分支51Testing软件测试网nU%Zy]w ?

51Testing软件测试网.]^b b5u(q5I

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

|'a.J1`8\{R051Testing软件测试网h&b4W6]j

51Testing软件测试网f[DHO

public class AssertCodeCoverage {51Testing软件测试网hcG%j;_

51Testing软件测试网2j&lbUjM'E

        public void verify(Boolean b) {51Testing软件测试网^;s+Q;TC
         assert b;
D0}G^9MBh C"@0        }

\C-a1|[h+aA051Testing软件测试网 Z%olQ?G0O

}

jwBLKx6N l7Cx0
51Testing软件测试网*B-TMjZ5o;waB

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

;r vn a$`3_[9]"Z Nw0

%i n7cC5wF,y'g0

7Q8@ M8K6a0gl0E3k0
public void verify(java.lang.Boolean b);51Testing软件测试网)zb&aV E0l5@
0  getstatic com.test.coverage.AssertCodeCoverage.$assertionsDisabled : boolean [16]51Testing软件测试网`!PF/UZ"l.g'} ]$}
3  ifne 2151Testing软件测试网DV0?7{K;k x.Y
6  aload_1 [b]
1\m&SN(f#wD PbW07  invokevirtual java.lang.Boolean.booleanValue() : boolean [28]
f viiz9A$|010  ifne 2151Testing软件测试网fv2U;{HuI|
13  new java.lang.AssertionError [33]51Testing软件测试网 A5E9Qg&cX
16  dup51Testing软件测试网3f(tp$o'V(uC4s'u
17  invokespecial java.lang.AssertionError() [35]51Testing软件测试网7X}J@` Z8D
20  athrow51Testing软件测试网:RVWTo_
21  return51Testing软件测试网)v/D:v.M ?&O)vU
}

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

  因此,从这个角度来说,想覆盖断言,不仅要关闭断言完成测试用例,还要在开启断言情况下完成测试。

n&U:M0Egu;mH"]0

  提示:隐式的分支(黄色)需要分析未覆盖分支。

^H)q&Gwm1R0

  15、不在覆盖范围内51Testing软件测试网5H-r J6q;N7l+{ I$u

  下面两种类型的代码不在代码覆盖统计范围内:51Testing软件测试网rR$PUi:b"M-e

  1)Java接口,接口里面都是抽象方法的结合,不含有任何代码细节;51Testing软件测试网|5A3[*Sc n7k6N

  2)不含有可执行java字节码的方法:抽象方法和本地native方法。51Testing软件测试网x ^z"pN"d j#fZ

h&@OKjg TU(B0

1wtAU }?,YZ@0abstract class AbstractService {51Testing软件测试网-C Oa `)c
        abstract String getString();  //不做统计51Testing软件测试网B u&CE*Y)l+S6R&a
        String getName() {  return getString().trim();    }51Testing软件测试网L i sX4lDA-X
}

-I&Pb)S6F/\)Kh0

G}w(FGt#n0public class BaseService extends AbstractService {51Testing软件测试网nBK3d9T3T
        @Override
,vJ|0^e9u3r+w0        String getString() {      return "zookeeper";    }51Testing软件测试网G_0|;_-g(`3^wa
}
51Testing软件测试网.^b PC \6Y ~x!L

  提示:不在统计范围内的直接忽视。

#S3W C M!{h5B(x0

  小结:51Testing软件测试网0d kh#rSrSh`

  通过对上面15种典型情况的概括,相信大家对代码覆盖的常见情景已有大概印像,在实际分析中,可以按照以下规则进行:

d A^E-k*YX0

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

"\;gP0vh\+J0

  2)优先级: 核心业务类->普通业务类->工具助手类->常量类;51Testing软件测试网|/@ L Z2gz)A9u

  经过不断的分析和推敲,相信大家得到的不仅是一个较高的代码覆盖率,更是对代码质量的一份信心。51Testing软件测试网L8K/jb~ V)Y


TAG:

 

评分:0

我来说两句

Open Toolbar