测试一直都有黑,白之分。由于白盒测试一般情况下需要有比较高的技术要求及比一般开发人员还要高的项目经验和缜密的逻辑思维能力,且测试时间较长,多用于单元测试,工具昂贵,所以一般国内的企业会忽略白盒测试,这也是为什么白盒测试诞生至今,在国内没有正式推广的原因。对于一个健康的测试团队来讲,必须要有一个或多个熟悉白盒测试的人员。让我们先分析下,一般情况下,要实施覆盖率测试,有几种完全不同的策略。
1 黑盒测试(功能测试)
黑盒测试是面向功能的测试,测试用例的依据是软件的需求,测试的对象是运行起来的软件。通常情况下,一个有经验的测试工程师根据需求说明书编写的测试用例在执行完成后,覆盖率一般能达到70%左右,需要N个工作日。要达到覆盖率的最终目标100%,还需要增加新的测试用例。有过覆盖率测试经验的朋友知道,剩下的30%可能需要 N* 3 工作日,甚至更多,同时为了达到更高的覆盖率,通常会产生大量重复的测试用例,大大增加的测试成本。下图为黑盒测试的覆盖率及成本使用效果图:
2 白盒测试
和黑盒测试正相反,白盒测试的测试用例的依据就是软件代码。测试工程师需要依据代码的逻辑结构、基本路径的分析,得到测试用例。因为该方法直接面向代码,写出的测试用例非常有针对性,每执行一个用例,覆盖率指标都能有新的提高,最终达到终极目标。听起来很不错,其实还有一个很大的问题,就是测试工程师需要分析所有代码的逻辑结构、调用关系、数据流等,仅此一项,就需要花费巨额的时间。另外传统单元级白盒测试仅仅关注程序覆盖方面,并不管程序单元组合和集成后的系统级功能。下图为白盒测试的覆盖率及成本使用效果图:
结合上述2种方法,ThreadingTest提出了全新的理念即穿线测试(TheadingTest),它采用了白盒和黑盒相结合的方法,以黑盒的测试方法,来得到白盒的测试数据。结合的优势:
3 穿线测试
既然上述讲到黑盒和白盒各有优劣,所以不如采用二者相结合的方法。穿线测试实际上属于创新型的系统级白盒测试工具,是软件测试领域里面全新的学术流派。它先通过传统黑盒测试把基本的功能都测试一轮,覆盖率达到70%,同时这个过程受到穿线测试工具的监控,并获取该阶段的测试结果数据;第二步,通过穿线测试得到的白盒结果,快速定位剩下30%的代码,进行针对性地增加测试用例,最终达到终极目标。经过很多客户的实践经验,这种方法对于覆盖率测试是最有效的,且测试时间最短。
说到这,很多测试人员肯定对穿线测试有浓厚的兴趣了,那我们接下来用故事来说明传统的白盒测试对测试人员的要求划分,以及穿线测试在这方面的应对策略:
一个关于代码覆盖率故事
一大早,一个年轻的程序员问大师:“我准备写一些单元测试用例。代码覆盖率应该达到多少为好?”
大师回答道:“不要考虑代码覆盖率,只要写出一些好的测试用例即可。”
年轻的程序员很高兴,鞠躬,离去。
之后没多久,第二个程序员问了大师同样的问题。
大师指着一锅烧沸的水说:“我应该往这个锅里放多少米?”
这个程序员看起来被难住了,回答道:“我怎么会有答案?这取决于要给多少人吃,他们饿不饿,有什么菜,你有多少米,等等。”
“完全正确,” 大师说。
第二个程序员很高兴,鞠躬,离去。
末了,来了第三个程序员问了大师同样的关于代码覆盖率的问题。
“百分之八十,不能少!” 大师一拳锤在桌子上,用严厉的口气回答道。
第三个程序员很高兴,鞠躬,离去。
一个关于代码覆盖率故事-解读
回复完这个之后,一个年轻的实习生走到大师身边:
“大师,今天我无意中听到了你对同一个代码覆盖率问题给出了三个不同的答案。为什么?”
大师从椅子上站起来:“给我泡点新茶,我们聊聊这个。”
当杯子里倒满了冒着热气的绿茶后,大师开始说:
“这第一个程序员是个新手,刚刚开始学测试。目前他有大量的程序都没有测试用例。他有很长的路要走;现在对他要求代码覆盖率只会打击他,没有什么用处。最好是让他慢慢的学会写一些测试用例,测试一下。他可以以后再考虑代码覆盖率。”
“而这第二个程序员,不论对编程还是测试都是十分的有经验。我以问作答,问她应该往锅里放多少米,使她明白决定测试用例多少的因素有很多,她比我更知道这些因素——毕竟是她自己的代码。对这个问题没有一个简单的、直接的答案。以她的聪明完全能明白这个道理,正确的完成任务。”
“我明白了,” 年轻的实习生说, “但是如果没有一个简单直接的答案,那你为什么告诉第三个程序员‘百分之八十,不能少’呢?”
大师笑的前仰后合,绿茶都喷了出来。
“这第三个程序员只想得到一个简单的答案——即使根本没有简单的答案 … 而且即使有答案她也不会按答案做。”
年轻的实习生和头发斑白的大师在沉思中喝完茶。
从上述故事我们可以发现:
第一个新手测试人员要进行覆盖率测试时,需要培养很长一段时间。
第二个有经验的测试人员在覆盖率测试时,需要对编程和测试以及被测程序的整体都要十分熟悉。
第三个说明测试人员在进行覆盖率测试时,覆盖率指标是有明确要求的。
但在实际操作过程中,国内因白盒测试人员的稀缺,培养周期长、昂贵以及测试进度的要求等问题导致其发展缓慢 。
针对白盒这种情况,穿线测试得提出全新的解决思路。
上文提到了穿线测试通过原有的黑盒测试方式,得到白盒结果,这样使得测试难度以及测试人员的能力要求大大降低,并在这个基础上,为了使得白盒测试结果更加方便理解,穿线测试又相继提出了可视化的代码覆盖率,以简单的图形显示,让广大不懂代码和程序内部结构的黑盒测试人员也能进行大师级别的代码覆盖率测试。
例:下图看到的截图为以穿线测试为理论,产品化的工具ThreadingTest中的截图:
图中覆盖率SC0解释说明:
[ 段 ]
在二个连续的分支点之间的计算机程序语句序列被叫作段。
[可视段]
在一个控制层之内最大可能的非-条件语句序列被称为可视段。在二节点之间可视段的长度可能是零(没有可执行语句)。
SC0
基本段测试覆盖度量也称为块测试覆盖。如果程序的所有可见段(程序块)至少被执行一次,则该段程序的SC0覆盖率达到了100%。
SC0= 被执行的块个数/该段程序包含的块个数(即可见段个数)
在图中,我们清晰地看到该函数的覆盖率SC0,是如何被计算出,且显示出相关的代码,通过这种方式展示,可以使广大没有接触过代码的测试人员,通过黑盒的测是方式,找出覆盖率中代码的没有覆盖到的部分,进行测试用例的补充,从而提升测试用例的制作,以及提高测试质量。
在ThreadingTest中,还有关于其它覆盖率的划分说明,如TRUE(真条件的百分比)、BOTH(条件真假的覆盖率百分比)、Branch(分支覆盖率)、MC/DC等。
请关注官方技术网站www.threadingtest.com中的覆盖率分析,有详细地解释说明和计算。
测试覆盖率作用
测试覆盖率是测试结束标准中的一部分
测试覆盖率低的模块 和 重要模块的测试覆盖率。这些数据可以帮助我们快速定位需要更多测试的模块,可以帮助我们了解重要模块的测试情况,以此来衡量我们测试用例的质量乃至测试的质量。
在螺旋式开发模式中,如果我们没有控制好我们上一个迭代中的测试覆盖率,当一个版本一个版本累加下来后,你就很难确定我们哪些模块在开发过程中没有给予足够的测试。
通过覆盖率,制定下阶段有效的测试计划
下图为测试覆盖率的报告
通过上图的覆盖率展示,我们可以进行下一步测试的整体方向计划。
检查未使用的功能
检查前10个的最低覆盖率
测试用例的加强
穿线测试覆盖率与验证阶段
验证阶段可以分为单元验证(UT)阶段、集成验证(IT)阶段和系统验证(ST)阶段。
单元验证阶段,关心的是模块功能和模块质量,此时出口条件为代码覆盖率。一般业内常用的出口条件是:行覆盖率达到100%,分支覆盖率达到100%,条件覆盖率达到95%,对没有覆盖率的需给出合理的说明。
集成验证阶段,关心的系统的功能,以及模块与模块之间的接口,此时出口条件为功能覆盖率。一般业内常用的出口条件是:功能覆盖率达到90%,对没有覆盖率的需给出合理的说明。
• 功能覆盖率高、代码覆盖率低:
验证计划不充分,需要增加功能覆盖点。
• 代码覆盖率高、功能覆盖率低:
设计没有实现指定的功能。
穿线应对测试覆盖率,达到最佳实践
传统的白盒测试
路径覆盖率 > 条件覆盖 > 判定覆盖 > 语句覆盖
测试覆盖率100%是一个理想的情况,是很难达到的
测试覆盖率100%不能说明我们做了完全的测试
测试覆盖率达到多少要考虑到软件整体的覆盖率情况,以及项目成本,包括人力,时间等等。
因以上因素,所以传统的白盒测试都不建议公司特意的去满足覆盖率测试指标,为了测试而测试。
穿线测试对于传统的白盒测试结果进行了测试数据统一管理,实现各阶段累计,缩短反复测试的时间,从而保证了测试100%覆盖率高质量化。
从原有的测试来看,正常测试中单元测试阶段、集成测试阶段以及系统测试阶段的测试数据是相互分开的,但是在实际过程中,单元测试的充分程度程度,对后期的集成测试、系统测试等都起到了关联作用,在这部分中穿线测试使用了累计覆盖率的技术,把整个测试的各个阶段的测试结果进行沿用和累计,这样使得整个测试迭代起到了量化关联的作用,可以随时对各阶段的测试进行分析和改善。
相比于传统的单元级的白盒测试,穿线测试还提出了分布测试方法,对于中大型软件或网站来说,单个测试人员是不能够完成整个测试任务的,为了更好的相互配合,ThreadingTest采用了分布式测试设计,在测试过程中,测试人员可以在不同地点,同时对某个程序或网站的不同模块进行测试,测试结果在不相互干扰的情况下汇总到中央服务器,这样使得每天每个人的测试数据结果有了统一的管理,从而对整个测试进度进行了有效的量化管理。
穿线测试的出现对测试界的改革
商用测试工具产品ThreadingTest把穿线理念进行了实际的产品化,通过工具的方式,让黑盒测试人员也能进行代码级别的白盒测试,并对整个测试各阶段的流程进行了量化的管理,通过黑盒测试来实现白盒结果的展示,完成了测试界中最有效的70%黑盒+30%白盒相结合的测试方法。
穿线测试打破了传统白盒测试操作难度高,过于追求覆盖率等方式,通过黑盒与白盒的结合,使各阶段的测试人员,都能正确按照自己的需求进行测试,从而避免了盲目性、反复性、遗漏性等问题。