小程序建站平台,如何压缩网站,wordpress+弹窗打开,wordpress 水煮鱼前言
单元测试是日常编写代码中常用的#xff0c;用于测试业务逻辑的一种方式#xff0c;单元测试的覆盖率可以用来衡量我们的业务代码经过测试覆盖的比例。
目前市场上开源的单元测试覆盖率的java插件#xff0c;主要有Emma#xff0c;Cobertura#xff0c;Jacoco。具体…前言
单元测试是日常编写代码中常用的用于测试业务逻辑的一种方式单元测试的覆盖率可以用来衡量我们的业务代码经过测试覆盖的比例。
目前市场上开源的单元测试覆盖率的java插件主要有EmmaCoberturaJacoco。具体对比如下
工具JacocoEmmaCobertura原理使用 ASM 修改字节码修改 jar 文件class 文件字节码文件基于 jcoverage,基于 asm 框架对 class 文件插桩覆盖粒度行类方法指令分支行类方法基本块指令无分支覆盖项目包类方法的语句覆盖/分支覆盖插桩on the fly、offlineon the fly、offlineoffline把统计代码插入编译好的class文件中生成结果在 Tomcat 的 catalina.sh 配置 javaangent 参数指出需要收集覆盖率的文件shutdown 时才收集只能使用 kill 命令关闭 Tomcat不要使用 kill -9html、xml、txt二进制格式报表htmlxml缺点需要源代码1、需要 debug 版本并打来 build.xml 中的 debug 编译项 2、需要源代码且必须与插桩的代码完全一致1、不能捕获测试用例中未考虑的异常 2、关闭服务器才能输出覆盖率信息已有修改源代码的解决方案定时输出结果输出结果之前设置了 hook会与某些服务器的 hook 冲突web 测试中需要将 cobertura.ser 文件来回 copy性能快小巧插入的字节码信息更多执行方式mavenant命令行命令行mavenantjenkins集成生成 html 报告直接与 hudson 集成展示报告无趋势图无法与 hudson 集成有集成的插件美观的报告有趋势图报告实时性默认关闭可以动态从jvm dump出数据可以不关闭服务器默认是关闭服务器时才写结果维护状态持续更新停止维护停止维护
其实上面的对比意义不大只看最后一条即可只有jacoco还在持续更新所以我们肯定首选jacoco。
maven工程使用jacoco配置
在jacoco官网上就有关于maven插件配置的示例包含单模块单元测试覆盖率报告和统计多模块单元测试覆盖率报告的配置。这里我也分单模块和多模块进行配置说明。 顺便说明在官网提供的单模块配置中需要使用两个命令才能生成测试覆盖率报告 $ mvn clean test # 生成jacoco.exec文件这里记录了测试执行的情况
$ mvn jacoco:report # 从jacoco.exec文件中解析并生成html测试报告单模块工程覆盖率报告生成
在pom.xml文件中添加如下插件配置
plugingroupIdorg.jacoco/groupIdartifactIdjacoco-maven-plugin/artifactIdversion0.8.7/versionexecutionsexecutioniddefault-prepare-agent/idgoalsgoalprepare-agent/goal/goals/executionexecutioniddefault-report/idphasetest/phasegoalsgoalreport/goal/goals/execution/executions
/plugin这里相比官网我添加了如下配置
phasetest/phase这个配置可以让我们在执行mvn test的时候直接生成测试报告不用单独执行mvn jacoco:report。
另外我移除了如下配置
executioniddefault-check/idgoalsgoalcheck/goal/goalsconfigurationrulesruleelementBUNDLE/elementlimitslimitcounterCOMPLEXITY/countervalueCOVEREDRATIO/valueminimum0.60/minimum/limit/limits/rule/rules/configuration
/execution这一段主要是用于检查测试覆盖率是否达到要求的配置我们很少在这个阶段进行覆盖率检查所以可以去掉这段配置为pom.xml瘦身当然如果有需要可以加上并且使用如下命令检查
$ mvn jacoco:check完成上述配置后使用如下命令即可生成测试报告测试报告在target/site/jacoco中
$ mvn test多模块工程覆盖率报告生成
在多模块的工程中测试执行的数据文件jacoco.exec和报告通常分散在不同的模块中看聚合结果非常不便因此我们通常会考虑将报告聚合起来看结果。
聚合报告的方式有两种一种是使用jacoco的maven插件提供的聚合功能这种方式在配置上比较麻烦但是配置完成后可以不依赖外部应用直接查看结果。 另一种方式是使用外部工具如sonar自动聚合报告这种方式配置简单但是需要以来外部应用。
使用sonar聚合报告的配置
使用sonar聚合报告的配置只需要直接在工程的root模块中配置如下插件
buildpluginsplugingroupIdorg.jacoco/groupIdartifactIdjacoco-maven-plugin/artifactIdversion0.8.7/versionexecutionsexecutioniddefault-prepare-agent/idgoalsgoalprepare-agent/goal/goals/executionexecutioniddefault-report/idgoalsgoalreport/goal/goalsphasetest/phase/execution/executions/plugin/plugins
/build然后再在root工程的根目录下配置sonar的扫描配置文件sonar-project.properties即可:
sonar.projectKey${projectKey}
sonar.projectName${projectName}
sonar.projectVersion${projectVersion}
sonar.languagejava
sonar.modules${module1},${module2}
sonar.sourcessrc/main/java
sonar.java.binariestarget/classes
sonar.sourceEncodingUTF-8
sonar.coverage.jacoco.xmlReportPaths..这里对属性作简单说明
${projectKey}是工程在sonar中的ID${prjectName}是工程在sonar中的名字${projectVersion}是工程在sonar中的版本通常来说可以自行定义不过建议跟应用保持一致如1.0${module1},${module2}是工程模块即模块在根目录的相对路径笔者这里没有验证是相对目录还是模块名称因为在我这里这两个是一致的通常也建议保持一致猜测是相对路径因为sonar并没有分析pom.xml文件实际上无法知道你的模块路径多个模块用英文逗号分隔
我们特别注意sonar.coverage.jacoco.xmlReportPaths这个属性的配置值是..表示上一层目录。这是因为sonar-scanner在扫描报告时会在执行路径生成.scannerwork文件夹并以此文件夹为workdir而我们需要扫描的目录是根目录因此需要使用..回到根目录。
这点可以在sonar-scanner的扫描日志中看到
INFO: Base dir: ~/workspace/griffin
INFO: Working dir: ~/workspace/griffin/.scannerwork我的执行目录是~/workspace/griffin因此basedir是~/workspace/griffin而working dir是~/workspace/griffin/.scannerwork。
完成上述配置之后我们就可以通过如下命令将报告扫描并上传到sonar了
$ mvn clean test
$ sonar-scanner -Dsonar.host.url${sonarUrl} -Dsonar.login${sonarUsername} -Dsonar.password${sonarPassword}这个过程发生了什么
先通过maven运行单元测试并在每个模块生成jacoco.exec执行数据文件通过jacoco.exec数据文件在每个模块的target/site/jacoco生成xml报告(还有html等其他格式的报告)sonar-scanner扫描根目录下所有xml报告并上传到sonar服务sonar服务整合计算报告并生成结果
最终我们可以在sonar中看到如下报告 使用jacoco聚合报告的配置
使用jacoco的聚合报告配置配置稍微复杂一些需要使用maven的ant插件我们可以在root工程的根目录下创建一个jacoco.xml文件它本质是一个pom文件 内容如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.jacoco/groupIdartifactIdjacoco-coverage-aggregate/artifactIdversion1.0.0-SNAPSHOT/versionbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-antrun-plugin/artifactIdversion3.0.0/versionexecutionsexecutionphasepost-integration-test/phasegoalsgoalrun/goal/goalsconfigurationtargetecho messageGenerating JaCoCo Reports /taskdef namereport classnameorg.jacoco.ant.ReportTaskclasspath path${basedir}/target/jacoco-jars/org.jacoco.ant.jar //taskdefmkdir dir${basedir}/target/coverage-report /reportexecutiondatafileset dir${basedir}/${module1}/targetinclude namejacoco.exec //filesetfileset dir${basedir}/${module2}/targetinclude namejacoco.exec //filesetfileset dir${basedir}/${module3}/targetinclude namejacoco.exec //fileset/executiondatastructure namejacoco-multi Coverage Projectgroup namejacoco-multiclassfilesfileset dir${basedir}/${module1}/target/classes /fileset dir${basedir}/${module2}/target/classes /fileset dir${basedir}/${module3}/target/classes //classfilessourcefiles encodingUTF-8fileset dir${basedir}/${module1}/src/fileset dir${basedir}/${module2}/src/fileset dir${basedir}/${module3}/src//sourcefiles/group/structurehtml destdir${basedir}/target/coverage-report/html /xml destfile${basedir}/target/coverage-report/coverage-report.xml /csv destfile${basedir}/target/coverage-report/coverage-report.csv //report/target/configuration/execution/executionsdependenciesdependencygroupIdorg.jacoco/groupIdartifactIdorg.jacoco.ant/artifactIdversion0.8.7/version/dependency/dependencies/plugin/plugins/build
/project在这个配置中我有三个模块因此在配置文件中有${module1}, ${module2}, ${module3}三个占位符分别代表三个模块的目录名实际使用的时候需要改成真正的值另外对于pom文件groupIdartifactId和version是必须的元素在这里其实随便起名即可示例中给了一个勉强通用的配置当然建议改成和工程相当的值。
完成上述配置后使用如下两个命令即可生成合并的测试报告
$ mvn clean test
$ mvn clean verify -f jacoco.xml最终可以在{project.basedir}/target/coverage-report目录下看到聚合的报告结果包含html和xml 这个过程发生了什么
先通过maven运行单元测试并在每个模块生成jacoco.exec执行数据文件使用maven指定jacoco.xml文件作为pom文件利用ant插件聚合单元测试覆盖率报告ant插件通过executiondata标签的配置搜集jacoco的数据文件ant插件通过structure标签的配置读取项目源码和字节码org.jacoco.ant.ReportTask类通过ant插件加载的执行数据和源码计算覆盖率生成报告
如果这时候希望聚合上报结果到sonar则需要将sonar-project.properties中的报告路径配置为聚合报告的结果
sonar.coverage.jacoco.xmlReportPaths../target/coverage-report/coverage-report.xml