欢迎来到天天文库
浏览记录
ID:52455694
大小:200.00 KB
页数:14页
时间:2020-03-27
《追求代码质量-不要被覆盖报告所迷惑.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、追求代码质量:不要被覆盖报告所迷惑您是否曾被测试覆盖度量引入歧途?测试覆盖工具对单元测试具有重要的意义,但是经常被误用。这个月,AndrewGlover会在他的新系列——追求代码质量中向您介绍值得参考的专家意见。第一部分深入地介绍覆盖报告中数字的真实含义。然后他会提出您可以尽早并经常地利用覆盖来确保代码质量的三个方法。您还记得以前大多数开发人员是如何追求代码质量的吗。在那时,有技巧地放置main()方法被视为灵活且适当的测试方法。经历了漫长的道路以后,现在自动测试已经成为高质量代码开发的基本保证,对此我很感谢。但是这还不是我所要感谢的全部。Java™开发人员现在拥有很多通过代码度量
2、、静态分析等方法来度量代码质量的工具。我们甚至已经设法将重构分类成一系列便利的模式!所有的这些新的工具使得确保代码质量比以前简单得多,不过您还需要知道如何使用它们。在这个系列中,我将重点阐述有关保证代码质量的一些有时看上去有点神秘的东西。除了带您一起熟悉有关代码质量保证的众多工具和技术之外,我还将为您说明:·定义并有效度量最影响质量的代码方面。·设定质量保证目标并照此规划您的开发过程。·确定哪个代码质量工具和技术可以满足您的需要。·实现最佳实践(清除不好的),使确保代码质量及早并经常地成为开发实践中轻松且有效的方面。在这个月,我将首先看看Java开发人员中最流行也是最容易的质量保证
3、工具包:测试覆盖度量。谨防上当这是一个晚上鏖战后的早晨,大家都站在饮水机边上。开发人员和管理人员们了解到一些经过良好测试的类可以达到超过90%的覆盖率,正在高兴地互换着NFL风格的点心。团队的集体信心空前高涨。从远处可以听到“放任地重构吧”的声音,似乎缺陷已成为遥远的记忆,响应性也已微不足道。但是一个很小的反对声在说:女士们,先生们,不要被覆盖报告所愚弄。现在,不要误解我的意思:并不是说使用测试覆盖工具是愚蠢的。对单元测试范例,它是很重要的。不过更重要的是您如何理解所得到的信息。许多开发团队会在这儿犯第一个错。高覆盖率只是表示执行了很多的代码,并不意味着这些代码被很好地执行。如果您
4、关注的是代码的质量,就必须精确地理解测试覆盖工具能做什么,不能做什么。然后您才能知道如何使用这些工具去获取有用的信息。而不是像许多开发人员那样,只是满足于高覆盖率。测试覆盖度量测试覆盖工具通常可以很容易地添加到确定的单元测试过程中,而且结果可靠。下载一个可用的工具,对您的Ant和Maven构建脚本作一些小的改动,您和您的同事就有了在饮水机边上谈论的一种新报告:测试覆盖报告。当foo和bar这样的程序包令人惊奇地显示高覆盖率时,您可以得到不小的安慰。如果您相信至少您的部分代码可以保证是“没有BUG”的,您会觉得很安心。但是这样做是一个错误。存在不同类型的覆盖度量,但是绝大多数的工具会
5、关注行覆盖,也叫做语句覆盖。此外,有些工具会报告分支覆盖。通过用一个测试工具执行代码库并捕获整个测试过程中与被“触及”的代码对应的数据,就可以获得测试覆盖度量。然后这些数据被合成为覆盖报告。在Java世界中,这个测试工具通常是JUnit以及名为Cobertura、Emma或Clover等的覆盖工具。行覆盖只是指出代码的哪些行被执行。如果一个方法有10行代码,其中的8行在测试中被执行,那么这个方法的行覆盖率是80%。这个过程在总体层次上也工作得很好:如果一个类有100行代码,其中的45行被触及,那么这个类的行覆盖率就是45%。同样,如果一个代码库包含10000个非注释性的代码行,在特
6、定的测试运行中有3500行被执行,那么这段代码的行覆盖率就是35%。报告分支覆盖的工具试图度量决策点(比如包含逻辑AND或OR的条件块)的覆盖率。与行覆盖一样,如果在特定方法中有两个分支,并且两个分支在测试中都被覆盖,那么您可以说这个方法有100%的分支覆盖率。问题是,这些度量有什么用?很明显,很容易获得所有这些信息,不过您需要知道如何使用它们。一些例子可以阐明我的观点。代码覆盖在活动我在清单1中创建了一个简单的类以具体表述类层次的概念。一个给定的类可以有一连串的父类,例如Vector,它的父类是AbstractList,AbstractList的父类又是AbstractColle
7、ction,AbstractCollection的父类又是Object:清单1.表现类层次的类packagecom.vanward.adana.hierarchy;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassHierarchy{privateCollectionclasses;privateClassbaseClass;publicHi
此文档下载收益归作者所有