`
woodbird
  • 浏览: 19036 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

持续集成+单元测试实践(下)

阅读更多

测试覆盖率

之前的项目采用Clover来进行测试覆盖率的测算,用着还不错,挺好用的。但是由于Clover是非开源的,要给钱,免费的licence过期了,只能换一个开源的了。这次选用了cobertura,一个Jcoverage的分支,也有maven的插件。

mavenpom进行配置:

<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 coveragebranch coverage。得出的报表是以子项目为单位的。由于coberturamaven插件中并未提供merge的功能,所有只依靠cobertura-maven-plugin无法得出整个项目的测试覆盖率。

但是可以依靠其他手段获得整个项目的。具体实施方法如下:

         1. 下载cobertura http://cobertura.sourceforge.net/download.html.(如果不想自己打包,可以直接下载bin文件而不用src.如果对其源码敢兴趣可以下载srccobertura是基于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)在持续集成的时候加入coberturacheck过程

修改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,添加coberturatab:

           <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>

其效果为:

1
0
分享到:
评论

相关推荐

    持续集成与单元测试xmzy.pdf

    持续集成与单元测试是现代软件开发中至关重要的两个实践。持续集成关注于通过频繁地集成代码到主分支上,从而及早发现并解决集成问题;而单元测试则强调编写和执行代码中最小可测试单元的测试代码,确保这些单元的...

    Flex持续集成之单元测试

    Flex持续集成之单元测试是开发过程中一个至关重要的环节,它主要关注的是Flex应用程序的模块化测试,确保每个独立的代码单元都能正常工作。通过单元测试,开发者可以预先发现和修复问题,提高代码质量和稳定性,同时...

    企业IT持续集成与持续交付实践.pdf

    持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)是企业IT实践中两个非常重要的概念,它们之间紧密相连,都是为了提高软件开发、测试和部署的效率和质量。下面我们将深入探讨这两个...

    CC++单元测试理论精要

    3. **持续集成**:频繁地合并代码并自动运行测试,及时发现问题。 4. **性能监控**:定期对测试过程进行性能监控,优化测试流程。 #### 五、怎样保证测试效果? 为了确保测试的有效性,需要关注以下几个方面: 1....

    持续集成、交付和部署:对方法、工具、挑战和实践的系统回顾.pdf

    研究识别了30种方法及其相关工具,这些方法和工具在以下方面促进了持续实践的实施:1) 缩短持续集成(CI)中的构建和测试时间;2) 增加CI中构建和测试结果的可见性和意识;3) 支持(半)自动化连续测试;4) 检测CI中...

    持续集成实践

    持续集成实践作为软件开发领域的一项重要实践,是保障软件开发质量、提高开发效率的重要手段。该实践强调开发团队成员频繁地集成他们的工作成果,通常每人每天至少集成一次,从而尽早发现和解决问题,减少集成的...

    持续集成技术与单元测试方法

    持续集成技术与单元测试方法 内容包括以下: 持续集成技术 – 持续集成的基本概念 – 持续集成的作用和优点 – 如何实施持续集成 • 单元测试技术 ...– 单元测试实践中常见的问题 – 单元测试工具

    持续集成测试工具与实践案例分享

    ### 持续集成测试工具与实践案例分享 在当今快速发展的软件开发领域,持续集成(CI)已经成为提升软件质量、加速开发周期的关键技术之一。本文将深入探讨持续集成测试工具及其实践案例,特别是聚焦于一种名为Toast的...

    cc++单元测试理论精要.doc.rar

    2. 结合版本控制系统,实现测试的自动化与持续集成。 七、最佳实践 1. 遵循单一职责原则,使测试更加简单明了。 2. 使用命名约定,使测试用例易于理解和维护。 3. 及时更新测试用例,当代码修改后确保测试仍能捕获...

    PHP持续集成实践

    2. **单元测试**:单元测试是持续集成的基础,它验证代码的最小可测试单元,如函数或方法。PHP中的单元测试框架主要是PHPUnit,它可以帮助开发者编写和执行测试用例,确保代码功能的正确性。 3. **Sonar**:Sonar是...

    敏捷实践之持续集成

    通过阅读《敏捷实践之持续集成》的相关资料,如“持续集成.mm”、“敏捷实践之持续集成(V1.0).ppt”以及“持续集成测试.txt”,我们可以获取更多关于如何在实际项目中实施和优化持续集成策略的深入见解和案例研究...

    iOS单元测试最佳实践

    在iOS开发中,单元测试通常还会与持续集成工具相结合,比如Jenkins、Travis CI等,以便在软件开发的各个环节中自动执行测试,并及时获得反馈。这种做法有利于持续监控应用代码的质量,并确保应用随着开发过程的推进...

    持续集成环境下运行单元测试和代码校验详细过程

    在软件开发领域,持续集成(Continuous Integration, CI)是一种实践,它要求开发者频繁地将他们的代码更改合并到主分支,通常每天至少一次,甚至更频繁。这样做可以尽早发现并解决代码冲突,减少集成难题,提高软件...

    持续集成与自动化测试

    持续集成(Continuous Integration, CI)是一种软件开发实践,它强调开发人员频繁地将他们的代码更改合并到主分支,通常每天至少一次。这一过程伴随着自动化构建和测试,以尽早发现和修复错误,从而提高软件质量与...

    jenkins+jmeter持续集成.pdf

    持续集成是软件开发中的一种实践,开发者可以频繁地(一天多次)将代码集成到共享仓库中。每次代码集成通过自动化构建(包括编译、测试等)来验证,从而尽快地发现集成错误。Jenkins可以配置定时构建任务,并在构建...

    智能运维:浅谈持续集成( CI)、持续交付(CD) 和软件测试.pdf

    无论是单元测试、集成测试还是系统测试,都是确保软件质量的防线。测试自动化是CI/CD成功的关键,它减少了手动测试的时间和错误,提高了测试覆盖率和效率。通过自动化测试,可以快速验证软件的功能和性能,确保每次...

Global site tag (gtag.js) - Google Analytics