软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试

测试覆盖率是对测试完成程度的度量。同属于一家公司,但是是为了更广泛的覆盖率统计而设计的工具。当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析。也就是就算没有源代码也可以统计到覆盖率数据,但是最后分析的时候,还是要结合源代码

测试覆盖率是对测试完成程度的度量。它通常依据某种覆盖准则来对测试用例执行情况进行衡量,以判断测试执行得是否充分。

——出自《计算机科学技术名词 》第三版

常见覆盖率统计工具

emma 与 是为单元测试而设计的覆盖率统计, 与 emma 同属于一家公司,但是是为了更广泛的覆盖率统计而设计的工具。

的文档中有个 章节,里面对 的定位描述的很好。原文的大意是说其他的工具没有得到积极有效的维护,而且其他的工具都是为了单一任务而设计,他们不是为了 “集成” 而生。从这一点上我们就可以看出 的设计理念。

得益于 的设计理念,以及良好的 api 设计,它可以轻松的与已有的工具集成,甚至进行平台化。它也可以同时用于单元测试与集成测试,所以是一款非常优秀的覆盖率统计工具,很多公司的精准化测试,就是重度依赖了 。

覆盖率分析原理

要了解代码覆盖率的统计原理,我们就需要去深入了解 jvm 的机制。这方面的知识是 java 领域的高端进阶知识,限于篇幅,我们只讲解下大概的原理,完整内容请参考 VM 虚拟机系列的书籍,以及 早年发布的若干代码插桩的资料。

简单说下原理,java 源代码会被 javac 编译为 class 文件,class 文件保存了 class 的基本信息与 jvm 的指令集。java 的底层 ,也就是 jvm 在解析 class 的时候,会把文件格式的 class 读取到内存并运行。 也是借鉴了这一整套的设计理念, 上的 其实是 与 art。

当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析。通常是在读取类的时候,在关键的指令块的出口与入口增加标记。当指令块被执行后,就会命中探针并完成记录。

要修改最底层的 jvm 字节码往往是比较麻烦的,需要精通 jvm 的各种指令以及 java class 结构。这方面的处理目前已有有非常成熟的开源项目可以做大了,如下就是一些知名的字节码修改工具。

其中 ASM 是所有字节码操作的底层基础,是最底层的字节码修改工具。其他工具是它之上的一些高级封装。借助于这些工具与 JVM 自身的一些调试特性,我们就可以对 jvm 代码或者进程进行便捷的操纵了。

插桩方式

插桩方式有很多种,常见的方式如下

支持字节码插桩与 这两种插桩方式。也就是就算没有源代码也可以统计到覆盖率数据,但是最后分析的时候,还是要结合源代码才能获得更多的覆盖率细节数据。毕竟覆盖率的统计,并不是只是简单的覆盖率数据本身的指标高低。

的工作方式

支持四种工作模式

很多人都会使用 file 模式,但是 tcp 模式才是最易用的。因为不需要申请服务器的文件访问权限就可控制覆盖率数据。你可以根据自己公司的部署情况选择合适的工作模式。

on the fly 插桩模式

on the fly 插桩模式是使用最多的。首先需要在你的被测 java 程序启动的时候,加入 jvm 的一些 参数。

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver、tcpclient、noneaddressport

你可以自己设置适合的工作模式。

离线插桩模式c语言apache下载配置,适合 的覆盖率统计,需要借助于 maven、 等构建工具的 指令。

on the fly 插桩模式

软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试

-cli 是 的一个组件,可以在不依赖 maven、 构建工具的情况下完成对代码的分析。主要用于 工作模式下。

用法如下

java -jar jacococli.jar dump [--address 
] --destfile [--help] [--port ] [--quiet] [--reset] [--retry ]

项目演练

这是学院里的一个动手演练的小场景,统计 工具的启动覆盖率

project_root=/Users/seveniruby/temp/java_2/jacoco/apache-jmeter-5.2.1jacoco_cli_jar=org.jacoco.cli-0.8.6-20200329.124045-45-nodeps.jarjava -javaagent:org.jacoco.agent-0.8.6-20200329.124039-45-runtime.jar   -jar $project_root/bin/ApacheJMeter.jar#退出jmeter#生成覆盖率报告java -jar $jacoco_cli_jar report jacoco.exec --classfiles "$project_root/bin/ApacheJMeter.jar" --classfiles $project_root/lib/ext/ApacheJMeter_http.jar --html jmeter_coverage/#生成带有源代码的覆盖率报告 java -jar $jacoco_cli_jar report  jacoco.exec   --classfiles "$project_root/bin/ApacheJMeter.jar"  --classfiles $project_root/lib/ext/ApacheJMeter_http.jar  --html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/#生成xml报告java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec  --classfiles "$project_root/bin/ApacheJMeter.jar" --classfiles $project_root/lib/ext/ApacheJMeter_http.jar --xml  jmeter_coverage_tcpserver2/jacoco.xml

完整代码请参考学员论坛中的课程帖中的源代码。

导入覆盖率

可以分析 的 exec 文件与 xml 文件c语言apache下载配置,并自动导入覆盖率。exec 文件的分析后续会放弃支持,主支持 xml 文件的分析。

 sonar-scanner     -Dsonar.host.url=http://sonarqube.testing-studio.com:9000     -Dsonar.login=$SONARQUBE_TOKEN     -Dsonar.projectKey=jmeter     -Dsonar.projectVersion=1.0    -Dsonar.coverage.jacoco.xmlReportPaths=$PWD/jmeter_coverage_tcpserver2/jacoco.xml   -Dsonar.projectBaseDir=/Users/seveniruby/projects/jmeter/   -Dsonar.java.binaries=/Users/seveniruby/projects/jmeter/

导入覆盖率

可以通过如下参数限定要分析代码的范围,通常是指明要覆盖的 范围

导入覆盖率

可以智能分析新老版本之间的新增代码的覆盖率,这点非常不错,以前一些分析代码 diff 的工作就节省了。他的代码分析也比较智能,简单的换行并不会干扰代码 diff 的分析范围。

通过覆盖率数据

支持两种通用的测试数据导入

这样方便与各种框架进行集成,也方便测试工程师二次定制。

通用测试数据模板。

通用覆盖率数据模板

在 的 分析中,加入对应的配置参数即可导入通用测试数据。

通用测试数据导入的常见用途

代码diff方法

代码的 diff 分析是一个比较大的话题,diff 只是对代码的最简单的一个分析策略,要想深入的理解代码,我们还需要更进一步的分析代码的调用链。我们先看最简单的代码 diff 分析工具。

代码 diff 分析工具

本文到此结束,希望对大家有所帮助。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/79363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐

软文友链广告合作联系站长qq81118366