关于代码质量度量和分析的一些总结

最近团队做CMMI3认证,这期间涉及到了代码质量度量。花了点时间做了总结,分享给大家。

先看一张整体的图,然后逐个指标展开说明。

 一、单元测试覆盖率

单元测试覆盖率(Coverage)是一个度量单元测试覆盖了多少代码的指标。它是一种衡量测试质量的方法,用来指示我们的测试用例覆盖了代码的多大部分。 覆盖率的计算方式通常包括以下几种: 行覆盖率(Line Coverage):测试覆盖了多少代码行。 分支覆盖率(Branch Coverage):测试覆盖了多少if、switch等决策点的所有可能路径。 函数覆盖率(Function Coverage):测试覆盖了多少个函数或方法。 语句覆盖率(Statement Coverage):测试覆盖了多少个语句。 覆盖率越高,表示的测试用例覆盖的代码越全面,代码的质量可能越好。但是,这并不意味着覆盖率100%就一定没有问题,因为覆盖率只是告诉我们测试了哪些代码,而不是告诉我们测试的质量如何。另外,有些代码可能很难达到高覆盖率,例如异常处理代码等。 一般来说,覆盖率应该尽可能的高,一般认为80%是一个比较好的目标。

二、代码复杂度

Cyclomatic Complexity(圈复杂度)和 Cognitive Complexity(认知复杂度) 都是软件度量中的复杂度度量指标。其中:

1. Cyclomatic Complexity圈复杂度在数量上表现为代码独立执行路径条数。 例如,每个“if”语句就会添加了一条额外的代码路径。圈复杂度越高,程序代码的判断逻辑就越复杂。此外,路径越多,就需要编写更多的测试用例来实现更高的代码覆盖率。 每个函数的平均圈复杂度是一个指标,可以比较程序之间的复杂性。 圈复杂度在一定程度上展示了程序代码的“可维护性”。

2. Cognitive Complexity(认知复杂度)是SonarQube提出的一种新的复杂度度量方法,它试图量化代码对人类理解的难度,而不仅仅是代码的结构复杂度。认知复杂度的计算考虑了程序的结构复杂度(如循环、判断分支等),以及程序的可读性(如代码的冗余性、是否遵守最佳实践等)。例如,一个包含嵌套循环和条件判断的函数,其认知复杂度会高于只包含顺序执行代码的函数。另一个例子是,使用了难以理解的短变量名或者包含冗长的函数和类,这些都会增加代码的认知复杂度。

三、代码重复度

代码重复度是指在代码库中有多少代码是重复的,也就是相似或完全相同的代码块出现的次数。

1. 代码重复通常是由于复制和粘贴编程(也称为“剪贴板编程”)导致的,这种情况下,开发人员可能会复制一个函数或一段代码,然后稍作修改以满足新的需求。虽然这种方法可以快速解决问题,但它通常会导致维护困难和错误的增加。如果在原始代码中发现了一个错误,那么所有复制的代码都需要进行相同的修复。。 代码重复度 = (重复的代码行数 / 总代码行数) * 100% 这个比例越高,表示代码重复的程度越严重。 在防止代码重复方面,通常的最佳做法是使用函数或类来封装重复的代码,并在需要的地方调用这些函数或类。这样,如果需要修改代码,只需要在一个地方进行修改,而不需要在多个地方进行相同的修改。

四、代码坏味道

"Code Smells"或"代码坏味道"是一种代码质量度量,用来形容那些在代码中可能存在问题的代码片段。它并不一定表示代码有错误,而是表示代码的设计可能存在问题,这些问题可能会使得代码难以理解、难以维护、难以修改。

以下是一些常见的代码坏味道的例子:

复杂的条件逻辑:如果一个函数或方法中存在过多的if/else或switch语句,可能表示这个函数或方法承担了过多的责任,需要进行重构。

长方法:一个方法过长,可能难以理解和维护。一般来说,一个好的方法应该只做一件事情,并且做得好。

重复的代码:如同前面提到的代码重复度,代码重复是一种常见的代码坏味道,应该通过提取函数或类来消除。

神秘命名:如果变量、函数或类的命名不清楚,可能会导致理解和维护的困难。好的命名应该清晰表达其目的和用途。 过大的类或模块:如果一个类或模块过大,可能表示它承担了过多的责任,需要进行分解。 

五、安全漏洞

Vulnerabilities或称为安全漏洞,是指在代码中可能存在的安全风险。这些风险可能被攻击者利用,从而对系统的数据和功能构成威胁。

SQL注入:如果代码中直接拼接SQL语句,而没有对用户输入进行适当的处理,那么攻击者可能会通过输入恶意数据来篡改SQL语句,从而进行非法查询或修改数据。

跨站脚本(XSS):如果网站直接输出用户的输入,而没有进行适当的转义或过滤,那么攻击者可能会通过输入包含JavaScript代码的数据,从而在其他用户的浏览器中执行这些代码。

路径遍历:如果代码中使用了用户的输入来构造文件路径,那么攻击者可能会通过输入特殊的路径(如"../")来访问到不应该被访问的文件。

不安全的反序列化:如果代码接受并反序列化了用户提供的数据,那么攻击者可能会通过提供恶意的数据来执行任意代码。

......

六、技术债务

Technical Debt,或称为技术债务,是一个比喻,用来描述因为选择了快速或简单的解决方案,而非最佳的解决方案,从而在未来需要付出更多的工作来解决这些问题的情况。这就像财务债务一样,如果不及时偿还,随着时间的推移,"利息"会越来越多。

技术债务是一个重要的度量指标,用来估算修复所有代码坏味道所需的时间。例如,如果一个代码坏味道需要花费30分钟来修复,那么这个代码坏味道就会产生30分钟的技术债务。所有代码坏味道的技术债务累加起来,就是整个项目的技术债务。

技术债务可以帮助团队理解和量化代码质量问题的影响,从而做出更好的决策。团队可以基于技术债务来决定是否需要对某部分代码进行重构,或者在新功能开发和技术债务偿还之间做出权衡。

需要注意的是,技术债务并非都是坏事,有时候为了满足业务需求,适当的接受一些技术债务是可以接受的。关键在于,团队需要意识到技术债务的存在,并且制定计划来及时偿还技术债务,防止其无限制的增长。

七、阿里、微软、Google这些世界级软件公司的代码质量度量值 

从公开的编程实践和代码质量标准中得到一些启示。这些公司通常都非常重视代码质量,并采取各种措施来保证代码质量,例如严格的代码审查流程、强制的单元测试和代码覆盖率要求、详细的编程规范和最佳实践等。此外,他们还经常使用自动化的代码质量检查工具,如静态代码分析工具,来自动检测代码中的问题。

单元测试覆盖率:这些公司通常都要求代码有良好的测试覆盖率。例如,Google在其测试博客上提到,他们的一些项目要求代码的单元测试覆盖率达到80%以上。 对于代码复杂度,一般来说,每个函数或方法的复杂度应该尽可能的低。有些组织可能会设定一个具体的阈值,例如,圈复杂度不得超过10。这意味着每个函数或方法的控制流程不应该有超过10个不同的路径。但是,这并不是绝对的,有时候为了实现复杂的功能,函数或方法的复杂度可能会较高。 对于代码重复度,一般来说,应该尽可能的低。有些组织可能会设定一个具体的阈值,例如,代码重复度不得超过5%。这意味着在所有代码中,不应该有超过5%的代码是重复的。但是,这也并不是绝对的,有时候为了代码的可读性和维护性,可能会有一些必要的代码重复。

对于代码坏味道,它是一种主观的度量,取决于团队对什么是“好的”代码的看法。一般来说,代码坏味道的数量应该尽可能地少。有些团队可能会设定一个阈值,例如,每1000行代码中不应该有超过10个代码坏味道。然而,这并不是绝对的,有时候为了满足特定的需求,可能会接受一些代码坏味道。 对于技术债务,它是一种估算修复所有代码坏味道所需的时间。一般来说,技术债务应该尽可能地低。有些团队可能会设定一个阈值,例如,每1000行代码的技术债务不应该超过10小时。然而,这也并不是绝对的,有时候为了快速交付功能,可能会接受一些技术债务。

八、研发度量指标大全

九、业内做代码扫描和度量分析的专业软件

SonarQube is a self-managed, automatic code review tool that systematically helps you deliver Clean Code. As a core element of our Sonar solution, SonarQube integrates into your existing workflow and detects issues in your code to help you perform continuous code inspections of your projects. The product analyses 30+ different programming languages and integrates into your Continuous Integration (CI) pipeline of DevOps platforms to ensure that your code meets high-quality standards.

 代码质量阀

 十、Azure Devops中集成SonarQube代码分析和上报

 当然,代码质量阀是可以定义的

文章转载自:Eric zhou

原文链接:https://www.cnblogs.com/tianqing/p/17893189.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF V8 pwn入门(一)

仍然是因为某些原因,需要学学浏览器pwn 环境 depot_tools建议直接去gitlab里下,github上这个我用魔法都没下下来 下完之后执行 echo export PATH$PATH:"/root/depot_tools" >> ~/.bashrc路径换成自己的就ok了 然后是ninja git clo…

《opencv实用探索·十七》calcBackProject直方图反向投影

在了解反向投影前需要先了解下直方图的概念,可以看我上一章内容:opencv直方图计算calcHist函数解析 直方图反向投影是一种图像处理技术,通常用于目标检测和跟踪。通过计算反向投影,可以将图像中与给定模式(目标对象&a…

c++ map

unordered_map #include <iostream> #include <string> #include <unordered_map>int main() {// 创建包含三个字符串的&#xff08;映射到字符串的&#xff09;unordered_mapstd::unordered_map<std::string, std::string> u {{"red", &qu…

《opencv实用探索·十八》Camshift进行目标追踪流程

CamShift&#xff08;Continuously Adaptive Mean Shift&#xff09;是一种用于目标跟踪的方法&#xff0c;它是均值漂移&#xff08;Mean Shift&#xff09;的扩展&#xff0c;支持对目标的旋转跟踪&#xff0c;能够对目标的大小和形状进行自适应调整。 cv::CamShift和cv::me…

焦炭冶金工艺3D可视化仿真展示更直观、形象

冶金行业作为重要的工业领域&#xff0c;其岗位实践培训一直面临着诸多挑战&#xff0c;随着web3d开发和VR虚拟仿真技术的不断创新和应用&#xff0c;冶金3D虚拟仿真实践教学平台应运而生&#xff0c;为钢铁生产培训带来了崭新的变革。 冶金3D虚拟仿真实践教学平台采用了先进的…

【CANN训练营】高阶笔记

Ascend C Tilling计算 Tilling基本概念介绍 大多数情况下&#xff0c;Local Memory的存储&#xff0c;无法完全容纳算子的输入与输出的所有数据&#xff0c;需要每次搬运一部分输入数柜进行计算然后搬出&#xff0c;再敲运下一部分输入数据进行计算&#xff0c;直到得到完愁的…

GoEasy使用手册

GoEasy官网 登录 - GoEasy 即时通讯聊天案例 GoEasy - GoEasy (gitee.com) 注意事项 接口使用人数上限为15&#xff0c;超出之后会请求超时返回408状态码&#xff0c;可以新建一个应用用来更换common Key 创建应用 ​ 添加应用名称&#xff0c;其余默认&#xff0c;点击…

算法通关村第十三关—数学与数学基础问题(青铜)

数学与数学基础问题 一、统计专题 1.1 符号统计 LeetCode1822给定一个数组&#xff0c;求所有元素的乘积的符号&#xff0c;如果最终答案是负的返回-1&#xff0c;如果最终答案是正的返回1&#xff0c;如果答案是0返回0。  题目比较简单&#xff0c;正数对结果完全没影响&…

CVE-2021-4145:类型混淆导致释放任意 file 结构体

前言 影响版本&#xff1a; v5.13.4 之前 测试版本&#xff1a;v5.13.3 &#xff08;感谢 bsauce 大佬提供的测试环境&#xff09; 漏洞发生在 fsconfig 处理时调用的cgroup1_parse_param 函数中&#xff0c;patch&#xff1a; diff --git a/kernel/cgroup/cgroup-v1.c b/k…

软路由R4S+iStoreOS如何实现公网远程桌面本地电脑

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 简介1.1 软路由的定义1.2 使用软路由的好处1.3 常用组网 二. 配置远程桌面公网地址三. 家中使用…

mysql原理--B+树索引的使用

1.索引的代价 在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价&#xff0c;它在空间和时间上都会拖后腿&#xff1a; (1). 空间上的代价 这个是显而易见的&#xff0c;每建立一个索引都要为它建立一棵 B 树&#xff0c;每一棵 B 树的每一个节点都是一个数据页&…

抖去推--短视频剪辑、矩阵无人直播saas营销工具一站式开发

抖去推是一款短视频剪辑和矩阵无人直播SAAS营销工具一站式开发平台。它提供了以下功能和特点&#xff1a; 1. 短视频剪辑&#xff1a;抖去推提供了一系列的剪辑工具&#xff0c;包括自动剪辑、特效制作、配音配乐等&#xff0c;可以帮助用户轻松制作出高质量的短视频。 2. 矩阵…

日志审计在网络安全中的重要性

日志审计是一种通过分析、识别和验证各种日志信息&#xff0c;以帮助企业了解其网络和系统的安全状态和活动的过程。这些日志信息可能来自各种来源&#xff0c;包括服务器、网络设备、应用程序、操作系统等。 日志审计的主要功能包括&#xff1a; 1.识别潜在的安全威胁&#…

创建第一个Vue2项目-----HelloWorld

创建第一个Vue项目 第一步先去安装Vue&#xff0c;一共有两种安装方式&#xff0c;这里使用 点击这里下载&#xff1a;Vue.js 添加到自己的项目中 在使用的页面引入<script src"../js/vue.js"></script> 2. 准备好一个容器 <div id"root&qu…

阿里云大数据工程师ACP认证,今天终于搞定了,87分

为啥我得去考个阿里云大数据工程ACP证书&#xff1f; 首先得声明&#xff0c;这不是因为我对阿里有多痴迷&#xff0c;也不是因为我想把我的简历装饰得花里胡哨。实际上&#xff0c;这更像是一场自我挑战的游戏。我就是一根筋&#xff0c;当时公司要求考阿里云大数据工程师认证…

Redis部署-集群

目录 集群 数据分片算法 哈希求余 一致性哈希算法 哈希槽分区算法 redis集群搭建 1.创建目录和配置. 2.将上述redis节点.构建成集群 3.使用客户端连接集群 集群模式下的故障转移流程 1.故障判定 2.故障迁移 集群扩容 集群 广义上的集群,只要是多个机器,构成了分布…

[IDEA] 写代码时没有类型推断的解决方法

本示例使用scala, 其他语言同理 使用 .var 时会自动生成变量 使用快捷键 CtrlAtlv 一样 val abc "abc"但是这个变量没有显式表现类型 期望 val abc: String "abc" 解决方法

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.1-9.13.4)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.13…

Linux安装MySQL数据库系统

1、MySQL的编译安装。 1.1、准备工作 &#xff08;1&#xff09;为了避免发生端口冲突、程序冲突等现象&#xff0c;建议先查询MySQL软件的安装情况&#xff0c;确认没有使用以RPM方式安装的mysql-server、mysql软件包&#xff0c;否则建议将其卸载。 [rootlocalhost ~]# rp…

微信社群机器人开发

简要描述&#xff1a; 删除朋友圈 请求URL&#xff1a; http://域名地址/deleteSns 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…