1.聊聊度量测试覆盖率的源码几种方式
2.实战|Java 测试覆盖率 Jacoco 插桩的不同形式总结和踩坑记录
3.关于代码覆盖率(Code Coverage)
4.精准测试之过程与实践 | 京东云技术团队
5.SonarQube8.3中的Maven项目的测试覆盖率报告
6.代码测试方式和工具
聊聊度量测试覆盖率的几种方式
测试覆盖率是软件测试完整性的重要指标。掌握它,启动能客观反映软件质量,源码明确测试状态,启动有效改进测试工作。源码然而,启动三网通话费源码获取真实覆盖率数据并非易事。源码本文将探讨几种主流的启动测试覆盖率度量方式。
首先,源码代码覆盖率关注测试执行过程中哪些代码被执行,启动哪些未被执行。源码代码覆盖率数据由代码粒度决定,启动包括源文件覆盖率、源码类覆盖率、启动函数覆盖率、源码分支覆盖率和语句覆盖率。度量工具如Java的Jacoco、Go的GoCov、Python的Coverage.py等,主要用于白盒测试,特别是单元测试。
在度量代码覆盖率时,需要使用特定的工具,如Python覆盖率工具Coverage.py。它通过Python内置的trace函数来追踪每一行代码的执行情况,并结合软件源代码分析测试覆盖情况,最后生成覆盖报告。
对于黑盒测试,如功能测试/系统测试,度量完整性的手段是需求覆盖率,即测试覆盖的需求数量与总需求数量的比值。需求覆盖率根据需求粒度不同,具体表现也有所差异。人工计算需求覆盖率是常见做法,需依赖标记每个测试用例与需求之间的映射关系。
代码覆盖率和需求覆盖率是面向测试过程的指标,但它们无法完全反映测试状态和水平。%的覆盖率并不意味着代码或需求被完全覆盖,实际发现的缺陷数量才是衡量测试完整性的关键指标——缺陷覆盖率。
软件测试通常分为多个阶段,每个阶段的任务不同。在后续阶段发现的缺陷中,属于当前阶段遗漏的缺陷最值得关注。缺陷覆盖率不仅提供评价测试工作成效的重要指标,还能指导我们改进测试工作。针对每一个遗漏缺陷进行深入分析,避免同类问题在未来再次发生。
本文总结了代码覆盖率、需求覆盖率和缺陷覆盖率三种常见的测试覆盖率定义和度量方法,它们各有优势和不足,但相互补充。迈出收集覆盖率数据的第一步,持续监测、zwyuanma中国源码利用和改进数据,是提升测试工作质量的关键。
实战|Java 测试覆盖率 Jacoco 插桩的不同形式总结和踩坑记录
本文为霍格沃兹测试学院优秀学员对 Jacoco 的总结和对使用过程中可能遇到的坑点记录。测试开发进阶学习,文末加群。一、概述
测试覆盖率是老生常谈的话题。本文主要关注Java后端的测试覆盖率。由于历史原因,公司基本不做单元测试(UT),因此我们更关心手工执行、接口执行(人工使用Postman等)、接口自动化、WebUI自动化对应用系统的覆盖度。
尽管Jacoco已流行多年,各种文档和帖子描述得很详细,但大多数文章都是针对特定形式的总结和使用方法。负责整个公司项目的覆盖率任务的人们需要一一研究和应对,经历多次入坑、出坑。
今年上半年负责公司不同类型的项目覆盖率统计技术的适配,对不同形式的项目有了一定的了解,记录下来,希望对他人有所帮助。本文由个人能力有限、表达能力有限所写,如有错误,欢迎指正。
二、投入覆盖率之前的思路
了解了Jacoco的部分机制,知道它提供了许多强大的功能,以满足不同形式的项目需求。Jacoco提供了API,可以屏蔽不同类型项目带来的困扰。
官方API示例地址:Jacoco.org/Jacoco/trunk...
使用API进行操作的好处包括:
屏蔽不同方式的构建部署。若想将此功能集成到平台中,API无疑是很好的方式。只需将Jacoco插桩到测试服务器上,暴露TCP IP和端口,剩余提取代码执行数据、生成覆盖率报告,就可以统一方式执行。Jacoco官方提供了Maven插件方式、Ant的XML方式,均有对应的dump和report进行覆盖率数据的dump和报告生成。三、项目梳理
公司是个老牌公司,项目杂乱无章,技术五花八门,至今仍有使用JDK6的项目。影响Jacoco使用过程的因素可能包括:
JDK版本:公司使用JDK6、7、PID源码SCL8,JDK6是个分水岭,其他版本基本可用JDK8适配。构建方式:Maven构建、ANT构建,也有使用Gradle的可能。启动方式:Java -jar启动、通过命令行启动、使用Tomcat启动WAR包(打包方式灵活)。部署场景:线上部署、测试部署、开发部署可能采用不同方式,开发者多倾向于使用插件方式启动,因为快速且集成IDE。四、Jacoco插桩的本质
Jacoco介入部署过程的本质是插桩,可以是编译时插桩或运行时插桩。选择on-the-fly模式。
本质在于,在应用启动过程中,让Jacoco相关工具介入部署过程,即介入class文件的加载,在加载class时动态改变字节码结构,插入Jacoco的探针。以TCPserver方式进行插桩,应用启动时在端口上开启TCP服务,接收执行覆盖率信息并保存。提供API连接TCP服务,进行覆盖率数据的dump操作。
五、不同形式的插桩配置
介入启动过程需要一个jar包:Jacocoagent.jar。配置需要介入的jar包路径、过滤class文件、TCPserver端口号、访问地址等。针对不同启动方式,需要在相应的启动参数中加入配置,如在java命令、war包启动、Maven命令、ANT构建、Java -jar启动时加入相应的配置参数。
六、注意事项汇总
在配置过程中,需注意端口管理、变量作用域、代码适配性等问题,确保配置的正确性和兼容性。
七、说给想做平台的你
对于想做增量覆盖率的平台,需要自动化配置,集成devops平台,超酷手机源码规划端口,使用API进行数据收集,确保不同启动方式的兼容性。
八、一些坑
在配置Ant构建时,确保compile阶段配置正确,避免数据无法注入。在多服务器部署负载均衡时,需要循环连接不同服务器的IP:port进行数据收集。确保编译环境的一致性,可以使用sftp下载代码。注意数据的及时保存和收集,防止覆盖率数据丢失或不准确。
九、补充API相关代码覆盖率数据的获取
可以封装覆盖率数据生成报告时所需的属性,如数据文件、源码、class文件等,生成报告时自动获取这些信息。若需要具体实现代码示例或获取更多代码,请参阅GitHub仓库。
十、总结
本文是对Java端覆盖率探索的细化总结,参考了相关资料和课程。期待与大家分享和探讨,共同进步。
关于代码覆盖率(Code Coverage)
代码覆盖率:衡量测试有效性的关键指标
代码覆盖率,作为软件测试中的重要概念,它衡量的是在测试过程中实际执行的代码比例,有助于识别哪些代码已测试,哪些未被触及。测试的目的是提高软件质量,而代码覆盖率能帮助我们评估测试深度和广度。
为何要关注覆盖率?因为虽然测试是质量保证的关键,但我们需要确切了解我们的测试是否覆盖了所有关键代码。高覆盖率并不意味着完美,它只是表明未被充分测试的部分。测量覆盖率有助于设定合理的测试目标,确保代码在各个模块中得到均匀测试,而非盲目追求高数字。
理解覆盖率的种类:源代码检测、运行时收集和中间代码检测,如Gcov、JaCoCo和Coverage,各工具的工作原理有助于我们选择适合的工具。选择时,应考虑工具的开源性、活跃程度和易用性。
当今主流的覆盖率工具众多,如针对不同编程语言的开源工具,选择时应侧重实用性。同时,简述pam源码要明白高覆盖率不等同于高质量测试,%覆盖率并非目标,因为过度追求可能导致无意义测试的增加。
正如Martin Fowler所述,代码覆盖率是寻找未被测试部分的工具,但它作为衡量测试效果的数字工具价值有限。理解这一点,我们才能更明智地使用代码覆盖率这一指标,确保我们的测试策略既全面又有效。
参考来源:lambdatest.com/blog/cod... atlassian.com/continuou...
精准测试之过程与实践 | 京东云技术团队
作者:京东工业 宛煜昕
・百度百科:
精准测试是一套计算机测试辅助分析系统。
精准测试的核心组件包含软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。
・其他定义
精准测试是中国自己有知识产权的完全的理论体系,它同时关注功能点和代码相关逻辑这样一个方法论,是一种灰盒的测试模式。
最开始在年的国际软件测试大会上发布精准测试的时候,它叫穿线测试,英文名字叫Threading Test,表达了精准测试的本质,Threading这个英文单词本身有两个含义,一个是穿线一个是线程,建立用例和代码的关系,相当于把黑盒和白盒关联起来,做黑盒测试也能看到白盒数据,同时把开发和测试能够关联起来,测试一做完,开发的逻辑马上就能自动生成。另一个层面,精准测试最本质就是线程测试,因为精准测试基于覆盖率白盒理论产生,它跟白盒最大的区别是它的覆盖率是线程级的,也就是说要追溯到用例这个级别。
・历史发展
・成熟度模型的五级划分
这里介绍两款,分别为JAVA和C/C++相关,
第一,开发的基础和核心(编程)知识及所需要用到的版本管理工具(GIT)等。
第二,领域特定的知识、技术需要具备如下:
JAVA:Javassist(官网 - https://www.javassist.org/),
ASM3.0(官网 - https://asm.ow2.io/),
JaCoCo(官网 - https://www.eclemma.org/jacoco/)。
C/C++:汇编、反汇编,PE,逆向工程(IDA)。
要用C/C++实现,通用与效率等方面没得说,但各协议的插桩,代码信息的收集,复杂程度和工作量都不是一般人所能承受,要做好心理建设。
直接使用JaCoCo需要注意覆盖率的误差,一些语句行,分支层级,其误差会被指数级放大。其更适用于偏向辅助个人开发者和小型项目组对项目覆盖率进行非常基础的评估。
・误差产生的具体成因:
1. 复杂系统通常由大量子模块组成,JaCoCo无法实现对于内部被调用的子模块进行插装,因此对于子模块覆盖率的评估会产生显著的误差。
2. 如果某个子模块没有被调用,那么对于JaCoCo来说,该模块内的方法等同于不存在。JaCoCo需要调用该子模块,才能将该子模块内的代码计入覆盖率计算的“分母”。
3. 除了几种既定的逻辑意外事件,JaCoCo无法正确处理例外情况(Exception),如果在控制流程中遇到Exception,JaCoCo会把这种情况直接标记为未覆盖,这种判定方式直接的影响到了对程序逻辑关系的把控,造成对于覆盖率无法准确评估。
・误差引发的后果:
1. 伪瓶颈的产生,以及对测试质量的错误高估。第一种情况,测试人员投入大量工作之后,却无法进一步提升覆盖率,造成对资源和实践的浪费;第二种情况,会让用户误将未达标的系统判定为达标,有可能引发严重的生产事故。
2. 无法实现缺陷定位,大量的算法和应用依托覆盖率的输入,而缺陷定位更是其中最主要的实践。
3. 回归测试的精准度,受到了严重的影响。
・无损插桩技术(推荐)
精准测试推出的SABI和SASI是中国自己的技术
SABI,SouceCode Analyzer ByteCode Intrumentation,就是说源码分析,字节码查看,观测和分析是在源码,插桩是在字节码。
SASI,SouceCode Analyzer SouceCode Intrumentation,这是传统商用白盒最基础的技术,有时候对源码进行分析,直接在源码插装。源码插装以后,代码经过高级语言、高级编译器的编译,直接生成最后发布包。这种是完全无损的标准技术,插装代码经过编译器编译后执行可靠性更高。
四、总结与介绍大纲1、测试范围,代码分析2、差异化3、调用关系4、度量与分析5、质量评估6、知识库兼优化7、用例预分析8、自动化测试与精准测试
五、平台> 设计思路
从产品的需求、功能模块,开发的代码到测试的用例,从正向到逆向的覆盖,追溯和可视。
> 大纲> 调用链与代码覆盖
使用的是插桩,有点类似C++中的Hook技术,获取所需数据信息。
协议,HTTP,MySql,Dubbo,Redis等,需要先进行分析,找到关键插桩位置,然后结合使用设计模式进行收集(所需)信息。
设计模式推荐两个,1、反射 + 适配器,2、动态代理。
需要注意,代码膨胀问题。
> 影响范围
假如有个应用系统开发出A版本提测,通过前端功能发起HTTP接口,平台的实时快照收到HTTP接口信息,将该次的接口相关信息(类、方法、执行代码行数)保存为系统快照; 当A版本开发后变为A_版本,使用平台对两次版本(Jar包或War包)进行比对,通过系统快照中信息会分析出变更项与影响项,如:类、方法、接口。
根据影响用例中的菜单与接口,到接口测试工具中进行执行。
> 实现与应用
通过数据进行可视化,显示服务 / 应用的启动,拓扑图,调用链,代码覆盖,版本比对等信息。
>> 项目列表
添加,服务 / 应用
>> 项目动态
启动,服务 / 应用
1、搜索
可显示多个服务 / 应用的拓扑关系图
1)详情视图
・表结构,可查看接口与数据库表间的关联
・热点,可查看接口与数据库表的关联个数
2)展开快照
这里显示的节点是保存到系统快照的。
・表结构 - 数据库表,远程服务 - 调用的 rpc 接口,源码 - 代码关系图层;
・远程服务,显示远程调用接口,如 dubbo 接口;
・源代码关系图谱,可查看代码关联关系和覆盖程度;
・清除图谱,清除表结构、远程服务、源代码关系节点;
・详情页,跳转到快照详情页;
・概要,显示快照详情中;
・删除节点,删除显示的节点;
2)搜索
・搜索数据库表中,表名,字段名,筛选条件;
・搜索接口,HTTP 接口;
2、监控台
通过HTTP接口实时获取到协议、代码相关信息,不同于通过单元测试得到代码覆盖率,然后将这些信息保存下来(我的快照和系统快照)。
1)实时监控
实时展示接口的调用链及链上各节点信息
2)我的快照
实时监控中可保存为我的快照,
2.1)调用链和链路分析的可视化
调用链即是服务与中间件的调用链拓扑图层;链路分析即是代码链路分析关系图谱。
・"流程图(拓扑图)" 中可查看到覆盖后端及各中间件信息;
・"堆栈列表" 中展示服务与中间件的应用名,类型,服务 / 方法,用时等信息;
・点击 "" 弹窗为代码图谱(代码链路分析关系图谱),点击某个节点,即显示某个方法的方法名称、执行到的代码行数、代码总数、代码覆盖率和圈复杂度信息,
根据某个尾节点,能寻到开始节点;
2.2)查看代码覆盖率报告
代码覆盖率信息列表,显示我的快照列表中所有覆盖率信息,类名、方法名、执行代码行数、方法行数、覆盖率、圈复杂度;
3、应用中心
1)在线应用
2)应用
2.1)系统快照
快照目录,点击链接进入系统快照详情页
系统快照详情页,基本信息页签
系统快照详情页,流程图页签
系统快照详情页,堆栈列表页签,点击 打开代码关系图层(代码关系链)
2.2)版本比对
比对文件格式为 Jar 或 War 包,比对之后会产生记录报告
开始比对后的结果显示,能查看报告,显示差异项,(比对)日志输出(新增、修改、变更、删除的文件与方法,类与方法的影响数)
2.2.1)报告
比对成功后查看报告,显示变更项,影响用例,对比日志;点击影响用例链接,会跳转到(系统)快照详情页
SonarQube8.3中的Maven项目的测试覆盖率报告
从SonarQube 6.2版本开始,测试报告整合为一份全面的报告,因此在Maven项目中,如果单元测试(由Maven Surefire插件执行)与集成测试(由Maven Failsafe插件执行)分开进行,如何配置JaCoCo Maven插件以生成涵盖这两种测试类型的报告?本文将指导你如何配置Maven项目结构、测试运行、测试报告生成以及在SonarQube中可视化测试报告。
首先,查看Maven项目的默认结构,通常包含生产源代码目录(src/main/java)和测试源代码目录(src/test/java)。为了将单元测试和集成测试分开,可添加一个名为src/it/java的新目录,并分别将它们放置于src/test/java和src/it/java中。
对于单元测试运行,Maven默认配置已包含在构建生命周期的测试阶段中。集成测试运行需手动完成,可通过Maven插件实现。确保在POM文件中配置BuildHelperMaven插件以将src/it/java目录添加到测试类路径中。同时,设置Maven安全插件的目标集成测试,自动绑定到集成测试阶段,以防集成测试失败导致构建取消。
使用JaCoCo Maven插件生成测试报告,它能为单元测试和集成测试生成合并报告。为此,需要配置两个代理并在测试运行期间生成报告。在POM文件中添加JaCoCo的目标prepare-agent和prepare-agent-integration,同时确保创建报告以供SonarQube读取。添加目标报告和报告集成到POM中,以便SonarQube识别报告位置。
在完成构建后,运行SonarMaven3插件(命令mvn sonar:sonar),告知Sonar Maven插件报告位置。在SonarQube仪表板中打开项目时,可查看总体测试覆盖率报告。
本文旨在为Maven项目在SonarQube中生成并可视化测试覆盖率报告提供详细指导,包括项目结构调整、测试运行配置、报告生成及SonarQube中报告的可视化。
代码测试方式和工具
代码测试方式和工具有哪些?
代码测试方式主要分为手动审查和工具扫描。手动审查是指开发者逐行阅读和检查代码,寻找可能的问题,比如代码风格错误、未使用的变量、潜在的安全漏洞等。工具扫描则使用自动化工具对代码进行快速、大规模的检查,这些工具能够识别出常见的编程错误、模式匹配问题以及不符合编码规范的地方。
静态分析工具是代码测试的重要工具,例如 SonarQube、PMD、FindBugs、ESLint、JSHint 等。它们可以分析源代码,生成详细的报告指出潜在问题。代码覆盖率工具如 JaCoCo、Cobertura 等,确保代码覆盖所有预期的功能和边缘情况,帮助查找未测试部分的缺陷。
静态类型检查器如 TypeScript、Java 的 Type Checking 等,帮助发现类型错误。安全审计工具如 OWASP ZAP、Sonatype Nexus 等,专门针对安全问题,检测敏感信息泄露、SQL 注入等风险。
持续集成/持续部署(CI/CD)中的自动化测试,在构建流程中集成代码审计,确保每次提交都经过严格的代码质量检查。代码异味检测工具能检测不良设计习惯或编码风格问题。
动态代码分析(Dynamic Code Analysis, DCA)与静态代码分析(SCA)不同,DCA 工具在代码执行时监测其行为,以识别运行时的安全问题,例如运行时的内存泄漏、缓冲区溢出等。
利用开源工具,如 Semgrep,可以获取针对多种编程语言的规则集合。对于自动化代码审计工具,它们通常具备管理误报(False Positives)和漏报(False Negatives)的机制,以提高审计的准确性。