更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢!

原文链接:http://www.cnblogs.com/zishi/p/6766994.html

众所周知Sonar是一个很强大的静态扫描工具,代码提交之后可以自动触发代码扫描,并给出report,因此给开发项目带来了很多便利。

日前我把本地版本升级到6.2了,项目的度量项也增加了许多。看过去一堆的ABCD,A应该是最好,D最差,但是中间的差别还是需要弄清楚。

为了更好的理解,我详细翻看了官方文档,同时也参考了网上一些参考,尤其是坏味道部分,

参考了大神Martin Fowler的《Refactoring: Improving the Design of Existing Code》关于代码重构的一些见解,

最后,我将所有这些资料在这里做一个总结,在此也分享给大家:

1、Reliability可靠性

1.1 Reliability Rating

可靠性比率的计算方法)

A = 0 Bug 最高等级A,表示代码无bug

B = at least 1 Minor Bug 代码只要有一个次要bug,等级就为B

C = at least 1 Major Bug 只要包含一个重要bug,等级将为C

D = at least 1 Critical Bug 只要有一个严重bug,等级评估为D

E = at least 1 Blocker Bug 只要有一个最高等级的阻断级别的bug,可靠性评估为E,最低级别。

1.2 Reliability remediation effort

修复所有缺陷问题成本/耗时

1.3 Reliability remediation effort on new code

在新增代码上修复所有缺陷问题成本/耗时

1.4 备注

图中气泡大小根据bug数变化,bug数越大气泡越大。视觉更加直观。

2、Security安全性

2.1 Security Rating

安全度指标计算方法

A = 0 Vulnerability 没有漏洞时,项目评估为最高级别A

B = at least 1 Minor Vulnerability 只要包含一个次要漏洞,项目评估为级别B

C = at least 1 Major Vulnerability 只要包含一个重要漏洞,项目评估为级别C

D = at least 1 Critical Vulnerability 只要包含一个严重漏洞,评估为D

E = at least 1 Blocker Vulnerability 只要包含一个阻断漏洞,项目评估为最低级别E

2.2 备注

lines of code 计量方法:包括至少一个字符,不包括空格。

图中气泡大小根据漏洞数变化,漏洞数越大气泡越大。视觉上直观显示。

3、Maintainability可维护性

3.1 Technical Debt

“技术债务”概念,这个概念最早是在 1992 年由 Ward Cunningham 在他的论文“The WyCash Portfolio Management System”中提出的,之后被软件工程界接受并推广,《重构》的作者 Martin Fowler 也在其网站上对技术债务有所介绍。其实原理可以理解为“出来混早晚要还的”,当前不规范的代码,会对以后产品修改的成本造成影响。Technical Debt 计算公式如下:

3.2 开发成本

开发一行代码(LOC)的成本。 示例:如果开发1 LOC的成本估计为30分钟,则此属性的值为30。目前我们采用的是系统默认值30。注意此处成本是指从零开始重写代码所需的成本。

3.3 可维护性

可维护性等级范围从A(非常好)到E(非常差)。 评级由技术债务比率的值决定,技术债务比率是将项目的技术债务与从零开始重写代码所需的成本进行比较。 A到D的默认值为0.05,0.1,0.2,0.5。任何超过0.5评级就为E。

举个例子:假设开发成本是30分钟,2,500 LOC的技术债务为24,000分钟的项目将有技术债务比率为24000 /(30 * 2,500)= 0.32。 因此项目的可维护性评级就是D。

4、Coverage覆盖率

4.1 Coverage

行覆盖和条件覆盖的混合。单元测试覆盖多少源代码。Coverage = (CT + CF + LC)/(2*B + EL),其中 :

CT = conditions that have been evaluated to ‘true’ at least once至少有一次被判断为true的条件数

CF = conditions that have been evaluated to ‘false’ at least once 至少一次被判断为false的条件数

LC = covered lines = lines_to_cover uncovered_lines 已覆盖的行数

B = total number of conditions 条件总数

EL = total number of executable lines (lines_to_cover) 所有可执行的代码总行数

4.2 Line coverage

单元测试覆盖行数密度

Line coverage = LC / EL

LC =
covered lines (lines_to_cover - uncovered_lines) 已覆盖的行数

EL =
total number of executable lines (lines_to_cover) 所有可执行的代码总行数

4.3 Condition coverage

Condition
Coverage=(CT+CF)/(2*B)

CT = 至少一次使用 ‘true’的条件数

CF = 至少一次使用 ‘false’ 的条件数

B = 条件总数

4.4 Unit test success density (%)

测试成功密度=(单元测试总数-(单元测试错误数+单元测试失败数))/单元测试数*100

5、Duplications重复

5.1 Duplication

SonarQube使用自己的复制/粘贴检测引擎,可以检测重复:

1、在源文件中

2、跨项目中的多个文件

3、项目的各个模块

4、跨多个项目

5.2 Duplicated Lines(%)

重复率=重复行数/总行数*100

Duplicated blocks:重复代码块行数

Duplicated files:重复文件数

Duplicated lines:重复行数

5.3处理Duplicated

a、分析这些重复,并通过使用继承或其他合适的模式来消除它们(只有在要对块进行单元测试时才这样做)

b、将复制的更改复制到复制的块上

c、使用问题和技术债务机制,通过编辑质量配置文件以包括来自公共Sonar存储库的复制块规则,监控成本并跟踪此错误的修复。

6、Size大小

7、Complexity复杂度

7.1 Complexity复杂度

以下关键词增加复杂性:if, for, while, case, catch, throw, return (不是方法的最后一个语句), &&, ||, ?

7.2 备注

else, default,  finally不增加复杂度

代码复杂度过高将难以理解、难以维护。

8、Code Smells坏味道

Code Smell

某些东西会混淆维护者或在读代码时产生误导。有时,Bug和Code Smell之间的界线是模糊的。 当有疑问时,问自己:“打破这条规则的代码是否是程序员想要的? 如果答案是“可能不是”,那么它是一个Bug。 否则它就是一个代码坏味道。

9、Issues问题

9.1 Open Issues

当前存在的全部问题

9.2 Reopened Issues

关闭后又重新打开的问题,可能由于之前误判关闭或者重新出现同样问题,需要再次将问题置为打开状态。

9.3 Confirmed Issues

确认的问题 - 通过确认问题,你基本上是承认:“是的,这是一个问题。” ,并将问题从“打开”状态移动到“已确认”状态。

9.4 False Positive Issues

误判问题-在上下文中查看问题,你意识到可能由于一些原因判定了这个问题,然而这个问题实际上不是一个问题,因此可以在此处标记为False Positive,然后继续下一步。注意:做此判断的人需要拥有项目的管理员权限。

9.5 Won't Fix

不修复的问题 – 通过查看上下文中的关联,你意识到虽然这是一个有效的问题,实际上并不需要修复。因此可以在此处标记为Won't Fix,然后继续下一步。注意做如此判断的人则需要拥有项目的管理员权限。

附录:参考文档一览

《Refactoring: Improving the Design of Existing Code》 [美]Martin Fowler

Sonar Project Page:https://docs.sonarqube.org/display/SONAR/Project+Page?src=search

sonarqube官方文档翻译之UserGuide :http://blog.csdn.net/chenmin_2014/article/details/54138759

作者原创技术文章,转载请注明出处

Sonar项目主要指标以及代码坏味道详解的更多相关文章

  1. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  2. 吐槽一下项目中的代码坏味道:滥用java常量

    我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...

  3. Understand:高效代码静态分析神器详解(转)

    之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...

  4. Understand:高效代码静态分析神器详解(一)

    Understand:高效代码静态分析神器详解(一) Understand   之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...

  5. Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/

    Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/ ===== 之前用Windows系统,一 ...

  6. Understand:高效代码静态分析神器详解(一) 转

    之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...

  7. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  8. “全栈2019”Java异常第六章:finally代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  9. “全栈2019”Java异常第四章:catch代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. cs231n spring 2017 lecture15 Efficient Methods and Hardware for Deep Learning 听课笔记

    1. 深度学习面临的问题: 1)模型越来越大,很难在移动端部署,也很难网络更新. 2)训练时间越来越长,限制了研究人员的产量. 3)耗能太多,硬件成本昂贵. 解决的方法:联合设计算法和硬件. 计算硬件 ...

  2. bzoj:1598: [Usaco2008 Mar]牛跑步

    Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M ...

  3. HDU 2502 月之数(二进制,规律)

    月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. chrome浏览器使用技巧

    在学校的时候一直在用firefox火狐浏览器,听一个学长说使用chrome浏览器在面试的时候有加分,而且还跟我说了一些chrome浏览器的使用技巧,最后从火狐浏览器转到谷歌浏览器,就一直在使用谷歌浏览 ...

  5. js函数声明的三种方式

    1.直接声明 function box(num1,num2){ return num1+num2;}alert(box(1,2)); 2.使用变量初始化 var box2 = function(num ...

  6. 解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)

    在CSS中对元素进行水平居中是非常简单的:如果它是一个行内元素,就对它的父元素应用 text-align: center ;如果它是一个块级元素,就对它自身应用 margin: auto.然而如果要对 ...

  7. 用于 C♯ 图像识别的轮廓分析技术

    用于 C♯ 图像识别的轮廓分析技术 供稿:Conmajia 标题:Contour Analysis for Image Recognition in C# 作者:Pavel Torgashov 此中文 ...

  8. /dev/shm 引起的内存统计问题

    最近,有个同事问我,怎么准确地描述linux系统到底还有多少内存可供我使用.这里不扯内存碎片问题,就说剩余总量. 如下: cat /proc/meminfo MemTotal: 263796812 k ...

  9. sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()

    http://blog.csdn.net/test_soy/article/details/50328367 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是 ...

  10. java面向对象的三大特性——多态

    多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底 ...