软件测试技术基础学习笔记之测试覆盖率
上一篇 / 下一篇 2009-01-10 17:19:25 / 个人分类:测试基础知识
#K~kP_n4H0
kbCp$WS2B_051Testing软件测试网7B,E)\tO-O
5@/Z6D1fPI0【摘要】在测试方法中粗略的介绍了几种测试方法。其中,白盒测试的动态分析方法中提到逻辑覆盖率测试有:语句覆盖、分支覆盖/判定覆盖、条件覆盖、条件—判定覆盖和路径覆盖。这里将详细阐述逻辑覆盖率测试。51Testing软件测试网/p8a!plFV'nr MS1h;S
mC g?pGE9S#u0
51Testing软件测试网!Ur8}aJ:ZgE5A5J|l3?Z(z2tA051Testing软件测试网f'U/L*t#qs8j3YH
准备知识:
4L!kN#Gw'Y051Testing软件测试网(X{Y5j6}0`c$Q)m可执行语句:可执行的一项操作;51Testing软件测试网3D-MG cRH/eYzh
51Testing软件测试网0A^$R;D6e?真、假分支:Ture、False51Testing软件测试网h QD @k4n1mV
~CF${I(o!B?0操作数(Opreand)、操作符(Operator):
IDB:xZ)L@#qP051Testing软件测试网0V:PCZ7~ h操作数:常量(整数、十六进制数、八进制数、实数、字符、字符串)、变量(简单类型、数组类型、记录类型、指针类型、联合等);
}[HJ\"^ra051Testing软件测试网~p;ta"u%}&i操作符:单一操作符、二进制操作符、条件操作符、赋值操作符等。51Testing软件测试网%fS\K G)IZ
覆盖率
3@b'Z5EwkK2p)c Z0概念:覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。51Testing软件测试网V Ua NQ)s;n
51Testing软件测试网j M/jjbb%K计算公式:51Testing软件测试网W#n#h*q$Xv%K,f
5QW)Tuo"_gT-Y0覆盖率=(至少被执行一次的item数)/item总数51Testing软件测试网W[c:Ghs1gbN
S`!\DS:{4u TQ0目的:评估测试的有效性,找出弱点,有目的的补充用例。
8@w&OJR5| pb {0tm-z051Testing软件测试网o/I{/f{缺点:测试成本随着覆盖率的提高而增加。(在一般的测试中有个指标)51Testing软件测试网6Im#Q`I5j#E"b
分类:
逻辑覆盖率(Logical Coverage),也叫代码覆盖率(Code Coverage)或结构化覆盖率,属于白盒测试的范畴。
语句覆盖(Statement Coverage)率:程序中可执行语句被测试的比例。
语句覆盖率=(至少被执行一次的可执行语句的数量)/(可执行语句的总数) 它最简单的覆盖,适合用于自动化测试; 几乎所有的测试都能实现语句覆盖率100%,所以它不是测试完整性好的度量。 判定覆盖(Decision Coverage)率/分支覆盖(Branch Coverage)率:程序中真、假分支被测试占的比例。
判定覆盖率=(判定结果被评价的次数)/(判定结果的总数) 它直接针对代码,容易被理解,实现判定覆盖率100%是可能的; 优于语句覆盖,但对于复合条件,两个或多个条件项的组合可能导致只有特定的分支被测到。 条件覆盖(Condition Coverage)率:每个条件操作数(Operand)可能的取值被测试所占的比例。
条件覆盖率=(条件操作数值被至少执行一次的数量)/(条件操作数值的总数) 条件操作符容易被确认,有助于自动化测试; 优于判定覆盖,但不能替代判定覆盖率 条件判断覆盖(Decision Condition Coverage/Branch Condition Coverage)率:设计足够多的测试用例来满足判定覆盖率和条件覆盖率
判定条件覆盖率=(条件操作数值或判定结果至少被评价一次的数量)/(条件操作数值总数+判定结果总数) 便于自动化,优于条件覆盖和判定覆盖; 不是完整的覆盖,还应该考虑路径覆盖。 路径覆盖(Path Coverage)率:设计足够多的测试用例,遍历程序的所有可能的路径
路径覆盖率=(至少被执行一次的路径数)/(总的路径数) 遇到复杂程序,循环次数多的时候,完成路径覆盖是很困难的,也没有包含判定条件覆盖。从上面的集中逻辑覆盖测试来看,它们相互补充,尽量达到被测试程序的100%,然而我们还是要明确测试是为了尽可能找出程序中的错误。却没有一种十全十美的测试方法来发现所有的错误,这也体现了测试的局限性。
/q#ek P5d{0
功能覆盖(Function Coverage)率,属于黑盒测试范畴。
需求覆盖:
需求覆盖率=(被验证到的需求数量)/(总的需求数量) 接口覆盖/入口点覆盖:使得系统的每个接口被测试到。以上所说的覆盖率都是属于结构化覆盖率的范畴,但是在面向对象领域中却遇到挑战。51Testing软件测试网`|o"\f8ky
面向对象的覆盖率:关于面向对象的一些特性的测试,如:多态性、继承性、封装性等。
)j9D)q#d,i0class Base{
~8t(i d&OO&[w;l0public:void foo(){helper();}
e H+m9_l r#Y0void bar(){helper();}
(ho#D Q*H5_f0private:virtual void helper(){...};};
jk AgZ [0class Derived:public Base{
/Dsfj2sE[@0private:virtual void helper(){...}};51Testing软件测试网q4]!?0Y/ju
对于上面那个程序,如果你测试到了Base.foo()和Dervied.bar(),表面上看,你测试到了Base::helper()和Derived::helper()方法,达到了分支和语句,甚至路径覆盖100%。但是Base::foo()和Base::bar()他们跟Base::helper之间的接口还没有覆盖到,所以必须加强测试。
-i Z d^p2~#L0在面向对象中,上下文是设计比较多的,上下文覆盖是一种收集被测试软件如何执行数据的方法。可以应用于多态、继承和封装的特性,也可以扩展到多线程应用。