单元测试覆盖率与CI

来源:互联网 发布:淘宝网聚划算睡衣 编辑:程序博客网 时间:2024/04/30 19:49

什么是代码覆盖率?

代码覆盖率指的是一种衡量代码覆盖程度的方式,通常会对以下几种方式进行统计分析:

行覆盖。它又被称作语句覆盖或基本块覆盖。这是一种较为常用且具有代表性的指标,度量的是被测代码中每个可执行语句是否被执行到。
条件覆盖。它度量的是当代码中存在分支时,是否能覆盖进入分支和不进入分支这两种情况。这要求开发人员编写多个测试用例以分别满足进入分支与不进入分支这两种情况。
路径覆盖。它度量的是当代码中存在多个分支时,是否覆盖到分支之间不同组合方式所产生的全部路径。这是一种力度最强的覆盖检测,相对而言,条件覆盖只是路径覆盖中的一部分。
在这三种覆盖指标中,行覆盖简单,适用性广,但可能会被认为是“最弱的覆盖”,其实不然。行覆盖相对于条件或路径覆盖,可以使开发人员通过尽可能少的测试数据和用例,覆盖尽可能多的代码。通常情况下,是先通过工具检测一遍整个工程单元测试的行覆盖情况,然后针对没有被覆盖到的代码,分析其没有被覆盖到的原因。如果是由于该代码所在分支由于不满足进入该分支的条件而没有被覆盖,那么开发人员才会进一步修改或增加测试代码,完成该部分的条件或路径覆盖。

可见,高效高质量的行覆盖是有效进行条件覆盖与路径覆盖的前提。行覆盖率越高,说明没有被覆盖到的代码越少,这样开发人员便会集中精力修改测试用例,覆盖这些数量不多的代码。相反,如果行覆盖率低,开发人员需要逐个检查没有被覆盖到的代码,精力被分散,因此很难提高剩余代码单元测试的质量。

代码覆盖率 = 被测代码行数 / 参测代码总行数 * 100%。

单测技术框架简介

[编辑]JUnit:

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即白盒测试。 使用JUnit时,主要都是通过继承TestCase类别来撰写测试用例,使用testXXX()名称来撰写单元测试。

官方wiki

建议:了解JUnit框架的原理

[编辑]TestNG:

TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架,但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如:

  • 支持JSR 175注释(JDK 1.4利用JavaDoc注释同样也支持)
  • 灵活的Test配置
  • 支持默认的runtime和logging JDK功能
  • 强大的执行模型(不再TestSuite)
  • 支持独立的测试方法。

官方网站

其他持续化集成工具/平台:

[编辑]maven

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。强大的东东!!!!

maven官方网站

Maven安装教程:Maven的安装、配置及使用入门

[编辑]sonar

(SonarQube)是一个开源平台,用于管理源代码的质量,一言蔽之:sonar是个异常强大的东西。

主要特点:

  •  代码覆盖:通过单元测试,将会显示哪行代码被选中
  •  改善编码规则
  •  搜寻编码规则:按照名字,插件,激活级别和类别进行查询
  •  项目搜寻:按照项目的名字进行查询
  •  对比数据:比较同一张表中的任何测量的趋势

Linux下安装

  1. $ wget http://dist.sonar.codehaus.org/sonar-3.4.1.zip
  2. $ unzip sonar-3.4.1.zip
  3. 2)和3)同上
  4. $ ./sonar-3.4.1/bin/linux-x86-64/sonar.sh start,启动sonar,登陆http://ip:9000;查看是否成功。

[编辑]eclipse

是一个开放源代码的、基于Java的可扩展开发平台。是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 附带了一个标准和丰富的插件集。

eclipse与sonar的集成 官方指南

[编辑]Jenkins

Jenkins,Hudson发展而来,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括:

  1. 持续的软件版本发布/测试项目。
  2. 监控外部调用执行的工作。

Jenkins与sonar的集成: 官方文档

Jenkins与Cobertura集成 官方指南

[编辑]Cobertura:

Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息,支持maven。 建议:了解Cobertura与maven结合的pom.xml配置及常用命令;既能够独立运行 也能够CI

sonar分析代码覆盖率架构

sonar架构

[编辑]构建UT测试持续化集成环境及覆盖率监控

驱动方式两种:

  • JUnit驱动
  • TestNG驱动
补充:上述两种驱动方式在maven种都需要这个plugin——maven surefire plugin;作用:根据不同的驱动进行不同的依赖配置,用来在maven构建生命周期的test phase执行一个应用的单元测试,maven充当构建管理和依赖包管理,通过maven引入第三方依赖和插件以及构建和自动化运行UT工程

所以需要maven的 pom.xml文件

  • 1)通过pom.xml指定cobertura的 plugin和相关属性

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<sonar.core.codeCoveragePlugin>cobertura</sonar.core.codeCoveragePlugin>
<sonar.cobertura.maxmen>512M</sonar.cobertura.maxmen>

</properties>

<plugin>

<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
  • 2)通过pom.xml指定单测范围
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.3</version>
<configuration>
<includes>
<include>**/*Test*.java</include>
</includes>
</configuration>
</plugin>
  • 3)指定cobertura插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>clean</goal>
/goals>
</execution>
</executions>
</plugin>
  • 4)配置maven setting.xml与sonar平台集成;
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.jdbc.url>jdbc:mysql://10.58.11.209:3306/sonar?characterEncoding=utf8</sonar.jdbc.url>
<sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<sonar.host.url>http://10.58.11.209:9000/</sonar.host.url>
</properties>
</profile>


# 触发方式:maven命令:mvn sonar:sonar

eclipse soanr插件的安装,上面已作介绍

Install new software选项安装-> 插件下载地址:http://dist.sonar-ide.codehaus.org/eclipse/ 勾选java版本,如图:

Eclipse-sonar.jpg

安装完毕后需初始化运行mvn命令,这时工程会出现类似maven工程的图标,然后关联sonar server。如图:

Sonareclipseserver.jpg

配置sonar server,需要sonar管理员添加用户及权限

Sonarserver.jpg

出现以下界面,恭喜你集成完成!



0 0
原创粉丝点击