测试覆盖率
之前的项目采用Clover来进行测试覆盖率的测算,用着还不错,挺好用的。但是由于Clover是非开源的,要给钱,免费的licence过期了,只能换一个开源的了。这次选用了cobertura,一个Jcoverage的分支,也有maven的插件。
在maven主pom进行配置:
<build>
<plugins>
……
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4-SNAPSHOT</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
<instrumentation>
<!--<ignore>.*</ignore> -->
<excludes>
<exclude>**/*Test.class</exclude>
<exclude>**/Abstract*TestCase.class </exclude>
<exclude>**/*Constants.class</exclude>
<exclude>**/*interface/*.class</exclude>
<exclude>**/*domain/*.class</exclude>
<exclude>**/*dataobject/*.class</exclude>
<exclude>**/web/**/*.class</exclude>
</excludes>
</instrumentation>
</configuration>
</plugin>
......
</plugins>
</build>
执行mvn cobertura:cobertura命令即可得出测试覆盖率报表,其中主要包括Line coverage,branch coverage。得出的报表是以子项目为单位的。由于cobertura在maven插件中并未提供merge的功能,所有只依靠cobertura-maven-plugin无法得出整个项目的测试覆盖率。
但是可以依靠其他手段获得整个项目的。具体实施方法如下:
1. 下载cobertura http://cobertura.sourceforge.net/download.html.(如果不想自己打包,可以直接下载bin文件而不用src.如果对其源码敢兴趣可以下载src,cobertura是基于ant构建的)
2. 执行 mvn cobertura:cobertura 命令。执行完成后在各个子项目的target/cobertura里面会生成cobertura.ser文件。但是主pom对应的target/cobertura目录下并没有cobertura.ser
3.将子项目的cobertura.ser进行merge,生成整个项目的cobertura.ser文件。
../cobertura-1.9.3/cobertura-merge.sh --datafile ./target/cobertura/cobertura.ser ./profile-ao/target/cobertura/cobertura.ser ./profile-core/target/cobertura/cobertura.ser ./profile-dal/target/cobertura/cobertura.ser ./profile-client/target/cobertura/cobertura.ser ./profile-common/target/cobertura/cobertura.ser
执行完上面命令后,在主pom对应的target/cobertura目录下会生成一个整个项目的cobertura.ser文件
4. 再执行mvn cobertura:cobertura命令。执行完成后,整个项目的测试覆盖率就生成了。
持续集成+测试覆盖率
测试覆盖率作为持续集成不可或缺的一个质量指标,将测试覆盖率和持续集成进行整合当然也就必不可少了。本项目持续集成平台采用CruiseControl
1.测试覆盖率结果作为持续集成是否通过的指标
(1)在maven中对cobertura的 check属性进行配置
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<check>
<branchRate>85</branchRate>
<lineRate>85</lineRate>
<haltOnFailure>true</haltOnFailure>
<totalBranchRate>85</totalBranchRate>
<totalLineRate>85</totalLineRate>
<packageLineRate>85</packageLineRate>
<packageBranchRate>85</packageBranchRate>
<regexes>
<regex>
<pattern>com.taobao.memberprofile.core.*</pattern>
<branchRate>90</branchRate>
<lineRate>80</lineRate>
</regex>
<regex>
<pattern> com.taobao.memberprofile.dal.*</pattern>
<branchRate>40</branchRate>
<lineRate>30</lineRate>
</regex>
</regexes>
</check>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
(2)在持续集成的时候加入cobertura的check过程
修改CruiseControl的配置config.xml
<schedule Interval="60">
<maven2 MvnHome="/opt/taobao/install/apache-maven-2.1.0" PomFile="${checkoutdir}/${project.name}/pom.xml" Goal="install cobertura:check cobertura:cobertura" />
</schedule>
2.将测试覆盖率结果展现集成到持续集成结果展现平台中
(1)将测试覆盖率报表放到artifacts目录里面。因为原来目录里面是没办法直接访问到的。
修改CruiseControl的配置config.xml
<artifactspublisher dir="${checkoutdir}/${project.name}/target/site/cobertura" subdirectory="cobertura" dest="artifacts/${project.name}/">
(2)集成到CruiseControl老的展示页面中(cruisecontrol路径下的)
首先,修改main.jsp,添加cobertura的tab:
<cruisecontrol:tabsheet>
<cruisecontrol:tab name="buildResults" label="Build Results" >
<%@ include file="buildresults.jsp" %>
</cruisecontrol:tab>
<cruisecontrol:tab name="TestCoverage" label="Test Coverage" >
<%@ include file="cobertura.jsp" %>
</cruisecontrol:tab>
<cruisecontrol:tab name="testResults" label="Test Results" >
<%@ include file="testdetails.jsp" %>
</cruisecontrol:tab>
<cruisecontrol:tab name="metrics" label="Metrics" >
<%@ include file="metrics.jsp" %>
</cruisecontrol:tab>
</cruisecontrol:tabsheet>
然后,添加cobertura.jsp:
其内容为:
<%@ taglib uri="/WEB-INF/cruisecontrol-jsp11.tld" prefix="cruisecontrol"%>
<cruisecontrol:xsl xslFile="/xsl/header.xsl"/>
<p>
<cruisecontrol:artifactsLink>
<iframe name="CoberturaFrame" id="cloverFrame" style="width:100%; height:600;"
marginheight="10" frameborder="0" marginwidth="10"
src="<%= artifacts_url %>/cobertura/index.html"></iframe>
</cruisecontrol:artifactsLink>
</p>
其效果为:
(3)集成到新的展示页面中(dashboard路径下的)
首先修改webapps/dashboard/WEB-INF/vm/build_detail/build_detail_pass ed. vm:
#parse("build_detail/build_detail_partial_header.vm")
<div class="build_detail_container">
<div class="sub_tab_container_menu">
<ul>
<li class="current_tab tab_toggle"><a><span>Artifacts</span></a></li>
<li class="tab_toggle"><a><span>Modifications</span></a></li>
<li class="tab_toggle"><a><span>Build Log</span></a></li>
<li class="tab_toggle"><a><span>Tests</span></a></li>
<li class="tab_toggle"><a><span>Test Coverage</span></a></li>
#parse('build_detail/build_detail_partial_widgets_tab.vm')
</ul>
</div>
<div class="sub_tab_container_content">
#set($artifacts_extra_attrs="")
#parse("build_detail/build_detail_partial_artifacts.vm")
#set($modification_extra_attrs="style='display:none'")
#parse("build_detail/build_detail_partial_modification.vm")
#set($log_extra_attrs="style='display:none'")
#parse("build_detail/build_detail_partial_log.vm")
#set($tests_extra_attrs="style='display:none'")
#parse("build_detail/build_detail_partial_tests.vm")
#set($coverage_extra_attrs="style='display:none'")
#parse("build_detail/build_detail_partial_testcoverage.vm")
#parse('build_detail/build_detail_partial_widgets_content.vm')
</div>
</div>
然后,在相同目录下新建build_detail_partial_testcoverage.vm
内容为:
<div id="test_coverage" class="widget" $coverage_extra_attrs>
#if( $buildCmd.build.artifactFiles.size() == 0)
<p>No Test Coverage Report found.</p>
#end
#foreach ($artifactFile in $buildCmd.build.artifactFiles)
#if($artifactFile.name.equals("cobertura"))
<iframe src="$url/index.html" style="width:100%;" height=600
marginheight="10" frameborder="0" marginwidth="10">
</iframe>
#end
#end
</div>
其效果为:
发表评论
-
高并发环境下系统宕机案例分析
2012-09-20 12:47 2379在性能测试的时候, ... -
linux下如何搭建简单的DNS Server
2012-09-20 11:34 1265环境:lenovo PC, SUSE Linux 11. ... -
JAVA基本数据类型和包装类型进行‘==’操作符运算的迷惑
2010-05-14 13:59 1273直接看代码: Integer i1 = 127; In ... -
Commons Attributes在maven plugin中的使用
2010-02-21 14:56 784根据普通注解,生成xml文件。 -
持续集成+单元测试实践(上)
2010-01-25 11:25 1600单元测试实践 1.测试框架选择Unitils 为什么选择U ... -
JSON tips
2009-12-10 18:47 757背景描述: 一个页面叫page.htm,它里面有个i ... -
maven-war-plugin 2.1-beta-1 改进
2009-10-10 16:17 1410maven-war-plugin 2.1-beta-1 相对于 ... -
加强CruiseControl对命令构建的支持
2009-09-28 17:40 1275CC中可以使用如下方式定义构建过程 <schedule ... -
velocity 的逃逸符
2009-09-28 11:01 11571. 如果变量var 没定义 \$var 显示为\$v ...
相关推荐
为什么选择Untils作为本次项目单元测试框架呢?Unitils的优点和介绍网上都比较详细:http://www.unitils.org/summary.html;它的主要模块有:·DatabaseModule:测试数据库维护和连接池·DbUnitModule:使用DBunit进行...
持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)是企业IT实践中两个非常重要的概念,它们之间紧密相连,都是为了提高软件开发、测试和部署的效率和质量。下面我们将深入探讨这两个...
持续集成技术与单元测试方法 内容包括以下: 持续集成技术 – 持续集成的基本概念 – 持续集成的作用和优点 – 如何实施持续集成 • 单元测试技术 ...– 单元测试实践中常见的问题 – 单元测试工具
持续集成测试工具与实践案例分
持续集成实践pdf是一本专业的软件开发类参考图书,该书系统介绍了持续集成的基础理论、核心价值、实践步骤以及测试工具等内容,理论讲解浅显易懂,适合入门学习,
是它的12个基本原则之一,”持续集成”是一种软件开发实践.它要求开发小组的每个成员频繁的集成他们的工作成果.这个频度通常是至少每天一次有时甚至每天多次开发团队的成员频繁的整合他们之间的工作.这种整合不是...
持续集成从“配置管理”、“构建”、“测试”、“部署及发布”及“团队习惯”5个纬度考察其成熟度,每个维度都有5个级别,分别是“入门”、“新手”、“中等”、“进阶”和“疯狂”。目前在各个维度上,行业的平均...
持续集成(CI)是一种软件开发实践,它倡导团队开发成员协同工作,有需要的时候就对代码进行集成,不必要等到软件开发后期才开始集成。jenkins是一个CI工具。它可以根据设定持续定期编译,运行相应代码;运行UT或...
在提升软件质量、降低研发风险、拒绝浪费方面,处于敏捷实践领域的持续集成(Continuous Integration,CI)起到重要作用。持续集成能够解决研发工作中的80%任务(日常),而剩下的20%任务(非日常)需要研发团队智力...
如何有效的解决上面这些问题?首先想到的是持续集成,能够做到自动化、集成测试和及时反馈问题,才能减少开发和测试的成本,提高团队的工程能效。
单元测试框架深入与分享 ...* 在持续集成系统中运行单元测试。 单元测试框架是软件开发中不可或缺的一部分。使用适当的单元测试框架和Mock框架,可以提高代码的质量和可靠性,并减少软件测试的时间和成本。
本书除了介绍持续集成的基本原则和工具之外,也介绍了测试驱动、代码审查、数据库集成、信息反馈等实践和工具。书中的各种主题介绍了今天在持续集成领域中运用的各种方法,帮助读者衡量需要进行的折衷。
持续集成(CI)和持续发布(CD)是软件开发中的一种实践,旨在提高软件的质量和交付速度。 在这个案例中,我们将使用 k8s、Docker、Jenkins 和 Git 来实现持续集成与持续发布。该案例将涵盖以下知识点: 1. k8s ...
通过和自动化测试工具/框架的集成,CI环境中可以执行几乎所有的自动化测试,但是一个必须要考虑的问题是,持续集成中测试覆盖面和提供快速反馈之间的平衡。 结论 CD和CI是两种软件开发实践,它们都是敏捷开发和...
藏经阁-灵雀云持续集成和持续交付功能实践 在这篇文章中,我们将探讨灵雀云持续集成和持续交付功能实践的详细知识点。 什么是 DevOps? DevOps 是一种软件开发方法,它强调开发团队和运维团队之间的协作,以提高...
基于python开发语言,针对当前基于http,webservice的接口方式
持续集成包含自动编译、自动化的代码审查、自动部署和自动化测试这些步骤。...越来越多的公司开始引入持续集成实践,并且为之组建专门的团队(很多公司的持续集成团队成员最初都是来源于测试或者质量管理团队)。
持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化...