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

最近团队做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,一经查实,立即删除!

相关文章

GUESS验厂容易通过吗?

Guess验厂是Guess面向其供货商的一种符合性要求。主要是关于从社会责任方面出发的综合管理体系。从用人、工资薪酬福利是否满足当地法律法规,员工的人权是否受到尊重,工作环境是否符合职业健康安全等。其验厂方式,除了追溯,还有不…

力扣面试经典题 | 找出字符串中第一个匹配项的下标

力扣面试经典题 | 找出字符串中第一个匹配项的下标 题目描述解题思路构建next数组使用next数组来做匹配 代码实现 题目描述 28.找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一…

CTF V8 pwn入门(一)

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

Helm 包管理器

一、什么是 Helm? Kubernetes 包管理器 Helm 是查找、分享和使用软件构件 Kubernetes 的最优方式。Helm 管理名为 chart 的 Kubernetes 包的工具。Helm 可以做以下的事情: 从头开始创建新的 chart 将 chart 打包成归档(tgz)文件 与存储 chart 的仓库进行…

《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 树的每一个节点都是一个数据页&…

简单的小题集(八)

文章目录 一、这题有点麻烦二、Nba 总冠军 2 一、这题有点麻烦 信不信这道题的核心内容连两句话都没有&#xff0c;说实话&#xff0c;就这不到两句话的题就能 把你做熄火了&#xff0c;不信你就试试呗&#xff1a; 皮皮的小南教大家玩数字&#xff0c;这不他拿出 n 个数字&am…

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

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

Python多线程thread与子线程

Python多线程Thread——生产者消费者模型-CSDN博客 python队列与多线程——生产者消费者模型-CSDN博客 import random import threading import time# 主线程 class MainThread(threading.Thread):def __init__(self, name, num0, target10):super(MainThread, self).__init_…

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

日志审计是一种通过分析、识别和验证各种日志信息&#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;当时公司要求考阿里云大数据工程师认证…