在Maven和Travis中使用Jacoco进行代码覆盖测试

测试是代码生命周期的一个很重要的部分,对于开源软件一份测试报告可以提高使用者对此代码的信任度。

测试覆盖率能体现出测试中所覆盖的代码范围,也能体现测试用例的设计是否合理。

话虽如此,但是自从懂事以来就没有给自己的代码写过测试类。JUnit也是拿来当Jshell用(这么方便的@Test哪里去找)

测试环境

这次配合自己写的一个开源库,所以配置了一套完整的测试步骤。

  • travis-ci(因为这个项目直接托管在github上所以用travis会比较方便)
  • maven(自动打包和测试)
  • jacoco(导出测试报告)
  • coveralls(第三方测试统计平台)

测试流程就是当代码Push到GitHub之后,travis创建VM开始执行maven对代码进行打包和测试,同时jacoco生成测试报告,完成之后将报告上传至coveralls。

配置项目

travis

首先登陆travis-ci.org关联账户(public repo免费,私有免费可以尝试gitlab),开启指定repo的hook

编写.travis.yml配置文件,我这里只对代码进行测试,你可以根据自己的需求定制配置文件,比如通过测试自动上传release之类的

language: java
jdk:
  - oraclejdk8
cache:
  directories:
    - '$HOME/.m2/repository'
script:
  - mvn clean package
after_success:
  - mvn clean test org.jacoco:jacoco-maven-plugin:prepare-agent install org.jacoco:jacoco-maven-plugin:report
  - mvn org.eluder.coveralls:coveralls-maven-plugin:report -DrepoToken="${COVERALLS}"

因为某些情况下会找不到jacoco的包所以这里的maven命令都带上了完整的包名。

配置maven pom文件

添加jacoco和coveralls插件

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
        <configuration>
            <skip>false</skip>
            <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
            <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
            <includes>
                <!-- 目标测试目录 -->
                <include>**/HappyTree/**</include>
            </includes>
            <rules>
                <!-- 自定义规则 -->
            </rules>
        </configuration>
        <executions>
            <execution>
                <id>jacoco-initialize</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <configuration>
                    <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
                    <outputDirectory>target/coverage-reports</outputDirectory>
                </configuration>
                <id>report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.eluder.coveralls</groupId>
        <artifactId>coveralls-maven-plugin</artifactId>
    </plugin>

配置Coveralls与Travis

上传测试报告需要使用token,而像public repo直接暴露token是不安全的,所以需要在Travis后台设置环境变量. More option -> settings -> Environment Variables.

在Coveralls里开启指定repo之后就可以在setting里拿到repo token

此时再进行push则可以正常进行代码的测试。

测试结果

Coveralls中对上传的jacoco报告的统计

Travis对编译的测试报告

同时这两个平台还自带badge, 可以贴到Readme中

Coverage Status Build Status