诊断J代码单元测试与自动化代码分析协同工作_第1页
诊断J代码单元测试与自动化代码分析协同工作_第2页
诊断J代码单元测试与自动化代码分析协同工作_第3页
诊断J代码单元测试与自动化代码分析协同工作_第4页
诊断J代码单元测试与自动化代码分析协同工作_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(工作分析)诊断J代码单元测试与自动化代码分析协同工作20XX年XX月多年的企业咨询豉问经验.经过实战验证可以落地机行的卓越管理方案,值得您下载拥有诊断Java代码:单元测试和自动化代码分析协同工作文章出处:DevelopWorks作者:转载发布时间:2005-10-19单元测试和静态分析通常被见作是有助于确保程序的正确性的互不相干的方法。本文研究了这俩种方法之间的关系,且讨论了构成每种方法工作构架的工具如何相得益彰。特别地,EricAllen讨论了壹些可用而又令人兴奋的新应用程序,这些应用程序允许您进壹步提升您的单元测试。这是壹场古老的争论一哪种方法对产生健壮代码更有价值:测试仍是静态分析和

2、验证?您会于程序员的日常工作中听到这种争论,尤其是于极端编程(ExtremeProgramming)论坛上。(请参阅我们由RoyMiller主持的XP论坛。)支持静态分析(包括类型检查)的主要论据是:其结果适用程序所有可能的运行,而通过单元测试只能保证被测试的组件(于测试它们的平台上)只适用测试组件的特定输入。支持单元测试的主要论据是它更容易处理。您能够测试程序的许多约束,这些约束远远超出了同期的静态分析工具所能达到的范围。请允许我于此冒昧地说壹句:我认为将这俩种工具见作对立的是壹个错误。每种工具均有助于构建更健壮的程序。实际上,它们能够通过非常强大的方式进行互每种工具均有各自的长处,对于补充

3、另壹种工具特别有用:?单元测试能显示执行的常用路径,从而显示程序是如何运行的。?分析工具能检查单元测试提供的覆盖范围。让我们研究这其中的每个属性,且讨论壹些可帮助您将其长处带给其它方法的工具。显示常用执行路径的单元测试单元测试套件提供了程序组件的示例用法的稳固基础。通过检查测试运行时程序是如何运作的,分析工具能够就开发人员希望于程序中保持的不变量进行试探性推测(就和程序员阅读单元测试所做的壹样)。仍有另壹种方法,其中单元测试能够是壹种可执行的文档形式。于从单元测试的运行中从特殊到壹般地推断出推测性不变量之后,分析工具能够尝试从壹般到特殊地验证不变量的存于,或者它能够利用可于运行时检查的断言注释

4、该代码。于任何壹种情况下,于该工具做任何其它工作之前,最好向用户返回推测的不变量集的方案,以询问用户真正想要哪些不变量。顺便提壹下,如果此类工具向用户方案了许多他们不想要的不变量,这可能是单元测试出了问题的信号一例如,它们不够壹般。可用这种方式和单元测试壹起使用的工具是Daikon,它是壹款来自MIT的MikeErnst的程序分析小组的免费的、试验性的工具。Daikon分析程序的运行变量,且将用户想要的不变量作为断言插入程序。(例如单元测试的运行)且尝试推测不变量。然后它询问用户是否想要这些不例如,假定我们编写壹个向量(Vector)的适配器,该适配器实现接口Sequence,该接口包含用于检

5、索元素的方法lookup和用于将元素放于向量末尾的方法insert。方法lookup带有壹个索引i,用来访问它所包含的向量。假定该数组的长度存储于字段length中。通过维护适配器中的长度,我们能够不通知向量本身就将元素从其尾部删除。让我们为这个假想的简单适配器编写壹个简单的测试用例:清单1.向量容器中简单查找方法的测试用例importjunit.framework.TestCase;publicclassVectorAdapterTestextendsTestCasepublicVectorAdapterTest(Stringname)super(name);publicvoidtestLo

6、okupAndInsert()VectorAdapterv=newVectorAdapter();v.insert("this");v.insert("is");v.insert("a");v.insert("test");assertEquals("Retrievedandinsertedelementsdon'tmatch","a",v.lookup(2);然后我们能够实现我们的适配器以通过这个测试,如下所示:清单2.类VectorAdapterimportjav

7、a.util.Vector;publicclassVectorAdapterimplementsSequenceprivateVectorvalues=newVector();privateintlength=0;publicvoidinsert(Objecto)length+=1;values.addElement(o);publicObjectlookup(inti)returnvalues.elementAt(i);interfaceSequencepublicvoidinsert(Objecto);publicObjectlookup(inti);当Daikon于这段代码上运行时,它可

8、能推断:对于方法lookup,i总是小于length。Daikon可能从单元测试中推断出这壹点,且向我们的方法方案壹条前置条件:i<length。然后程序员能够检查Daikon方案的不变量,从而更好地了解其测试覆盖程序的范围到底怎么样。例如,如果Daikon开始推断出大量不想要的不变量,这意味着单元测试只是用不具代表性的可能的程序输入的子集检测了程序。尽管Daikon是用Java语言编写的,但它需要用C+编写的前端,这削弱了它原有的可移植性。尽管如此,仍是能够于线获得针对许多主要平台的前端构建。此外,Daikon团队也打算添加其它平台所需要的构建。(您能够于参考资料壹节找到关于Daiko

9、n的下载信息和更多内容。)能够检查单元测试覆盖范围的分析工具分析工具能够帮助程序员构建健壮的单元测试套件。迄今为止,完成这壹工作主要有俩种方法:?使用静态分析以尝试自动生成单元测试套件?使用静态分析来确定单元测试套件对程序功能的覆盖范围到底怎么样目前有几种试图自动从代码产生单元测试的免费工具,但大多数担任这项任务的免费工具仍处于起步阶段。其中壹些比较有希望的是JUnitDoclet和JUB("JUnittestcaseBuilder”的缩写)SoUrCeForge上得到它们(参考资料壹节提供了它们的链接)。关于这些类型的工具,要牢记的要点是:最适宜应用于通过测试更新旧代码。当构建新项

10、目时,它们的作用不大。为什么会这样呢?因为新项目应该和项目上的单元测试是壹前壹后构建的。开发单元测试是构建设计的强有力的方法;针对组件的API就是于编写测试时隐式地为它们设计的。止匕外,以这种风格进行设计向设计师提供了即时的反馈。糟糕设设计将非常难于编写测试!且且,任何分析工具于确定为程序编写什么测试这方面,均很难做得象设计师那样好。第二种分析工具分析程序及其单元测试,且确定测试能于多大范围内覆盖程序。和刚才提到的第壹类工具不同,此类工具对每个项目均是有用的。实际上,极端编程团队能够考虑将此类工具集成到他们的代码提交过程中。那么,他们不仅能够防止代码于通过所有测试之前被提交,而且能够防止代码于

11、未经测试的情况下提交!不仅懒惰会导致测试覆盖范围偏小,错误也可能导致同样后果,因此,此类强制措施对任何技能(和完整性)级别的程序员均有用。Clover是壹种能够执行此类分析的新的且且特别有希望的工具。Clover是Ant的插件,Ant是make的流行的、全Java的替代物。Clover是商业工具,但它能够免费用于开放源码项目。Clover分俩阶段过程进行工作。首先,它于编译时检测代码。然后,于测试时将有关测试的运行信息写到用来生成方案的数据库中(通过GUI、网页或于控制台中)。将Clover集成到使用Ant的现有项目中很简单。这涉及调整项目的build.xml文件以添加几个于编译、记录测试和生

12、成报表期间检测代码的目标。例如,假定我们有壹个带构建和编译目标的build.xml文件。我们所必须做的全部工作是将CloverJAR文件放到我们的Ant库目录中,且如下所示扩展build.xml文件(Clover用户指南中提供了这些和类似于Ant目标的信息;为了方便,我于这里包括了它们):清单3.扩充Antbuild.xml文件以使用Clover<propertyname="clover.initstring"value="/tmp/mycoverage.db"/><targetname="with.clover"&

13、gt;<propertyname="piler"value="org.apache.tools.ant.taskdefs.CloverCompilerAdapter"/></target><pathid="clover.classpath"><pathelementpath="<CLOVER_HOME>/lib/clover.jar”/><pathelementpath="<CLOVER_HOME>/lib/velocity.jar”/&

14、gt;</path><targetname="clover.report"><javaclassname="com.cortexeb.tools.clover.reporters.html.HtmlReporter"><argline="-outputdir/tmp/clover_html-showSrc-initstring$clover.initstring-title'MyProject”7><classpathrefid="clover.classpath”/>

15、;</java></target>特性clover.initstring指定了壹个文件,有关Clover覆盖范围的数据将写入这个文件中。目标with.clover用来于执行其它目标(如compile和test)时打开Cloveroclover.report目标用来接收累积的覆盖范围数据且生成方案。于上面的代码中,我们将生成HTML方案。我们也能够生成文本方案(对于提供给脚本以确定测试的覆盖范围是否可接受非常有用)和基于Swing的方案。设置clover.classpath是必要的,以便方案生成器目标知道到哪里找到它所需要的所有类。可是,放于类路径中的第二个JAR文件(v

16、elocity.jar)只有于生成HTML方案时才是必需的。壹且完成了上述工作,就能够用以下命令生成Clover万案:$antwith.clovercompiletest$antclover.report就是这么简单。请查阅流行的编码工具JBoss和Ant的于线Clover方案,以获取壹些样本输出。(您能够于参考资料壹节找到更多有关这些内容的下载信息和其它信息。)俩种方法的结合本文中讨论的工具突出了壹些能够将程序分析和单元测试壹起使用的方法,以提供比单独执行任何壹种方法均更有效的不变量检测。这些技术只代表了所有可能技术的冰山壹角。将来,其它工具可能会提供更强有力的单元测试能力。例如,类型推断(

17、type-inference)引擎和优化编译器能够从现有的单元测试推断线索、UML生成工具能够从测试构造各种图表(不仅是类图)等等。对于合且这些方法以获得更佳的代码构建和故障诊断而言,仍存于着巨大的空间能够进行创造性开发和实验。请记住每种方法的属性及其长处:?单元测试能够演示程序于特定的运行期是如何运转的;仍能说明执行的常用路径。?分析工具能够检查所有可能运行的程序的某些特定属性。每种方法的长处均能够用来弥补另壹种方法的潜于弱点。下壹次,我们将研究增强的单元测试的另壹条路径,且了解壹些最新的工具,它们可用于帮助您于GUI上开发单元测试。参考资料?请单击文章顶部或底部的讨论参和本文的论坛。?了解

18、所有关于Daikon(用C/C+和Java前端进行动态不变量检测的原型实现)的内容,且从Daikon网站下载它?请查阅Cloveruserguide以获取更多关于该工具的信息,该工具用来发现未被执行的代码部分,且确定何处的代码未经足够测试。?Clover和Ant(基于Java的构建工具)紧密地集成于壹起,如果您仍没有副本,请下载壹个。?JUnitDoclet是使用XDoclet的开放源码单元测试生成工具。?单元测试是极端编程的关键实践。于RoyMiller的developerWorks专栏DemystifyingExtremeProgramming中了解关于所有极端编程实践的更多信息。您也能够

19、从developerWorksDemystifyingExtremeProgramming论坛获得Roy关于您XP问题的解答。?另壹种开放源码生成工具是JUB(JUnit测试用例构建器),可从SourceForge获得。?能够于JUnit网站上找到更多扩充单元测试的工具。?NicholasLesiecki于其文章“TestflexiblywithAspectJandmockobjects”(developerWorks,2002年5月)中介绍了关于测试用例独立性的问题,且向我们展示了如何使用仿真对象和AspectJ来开发准确而又强壮的单元测试。ErikHatcher于其文章“Automatingthebuildandtestprocess(developerWorks,2001年8月)中,向您展示了他是如何修改流行的Ant1.3和JUnit测试框架,以实现构建和测试过程的完整的、定制的自动化。?WebSphere开发者园地于“ApplicationQualit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论