知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技  > 软件

Java代码质量检查工具及使用案例

发表时间:2022-03-25来源:网络

Java代码质量检查工具及使用案例

在如今的软件开发中,因为软件的复杂度愈来愈高,业务也覆盖很广,各个业务模块业务错综复杂。这样就须要咱们须要团队开发,在咱们团队中开发人员的经验、代码风格样式都不一致,以及缺少统一的标准,从而致使咱们的整个项目的的代码难以阅读,不便于后期维护。这几天在研究代码质量管理,根据在网上搜集的资料及跟前辈学的一点经验整理一下,有须要的同窗们能够查看,也便于之后本身回顾。html

 

主要对下面的七块进行分析java

编码格式规范node

代码重复web

代码覆盖率编程

依赖项分析数组

复杂度监控安全

Java模拟技术网络

代码评审和重构多线程

 

接下来的使用Eclipse 插件来揭示这些分析领域:架构

编码格式规范:codeStyle和CheckStyle

代码重复:PMD 的 CPD

代码覆盖率:Coverlipse或者Emma

依赖项分析:JDepend

复杂度监控:Metrics

Java模拟技术:EasyMock、PowerMock

代码评审和重构:Jupiter

 

编码格式规范

codestyle介绍

统一的代码规范能提升代码的可读性、可维护性。

通常规则和格式规范:如代码缩进、程序块规范、每行最大代码长度;

命名规范:如包名、类名、接口名、枚举、属性名、方法名、参数名等命名规则;

文档规范:如类文件头注释、变量注释、方法注释等;

编程规范:如异常、并发、多线程等;

其它规范:如日志格式等。

图1

能够导入代码格式,实现统一。

checkstyle介绍

安装checkstyle 的Eclipse插件

1.      下载地址:

http://pan.baidu.com/s/1o6LOSwM

 

2.      解压net.sf.eclipsecs-updatesite_5.6.1.201306282206-bin.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\cs(注:必定不用起名为checkstyle,不知道为何此名就是安装不成功),此文件夹下有两个文件夹features、plugins。

3.      咱们使用link的方式安装。在Eclipse的dropins文件夹下新建checkstyle.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\cs

4.      关闭Eclipse,重启。而后在Eclipse的window》Preferences下就能够看到checkstyle菜单,安装成功,以下图

图2

 

使用checkstyle

自定义CheckStyle规则,下面是我定义的CheckStyle模板,而后导入

 

图3

把新导入的,设置为默认

图4

能够修改其中的值,点击“Configure…”按钮。

图5

 

下面是我自定义的CheckStyle.xml文件,供参考。

 

 

        

   

         

         

         

             

        

       

     

         

         

         

 

         

         

         

         

        

         

         

             

         

                                       

         

         

         

         

         

         

         

         

         

         

       

         

        

         

         

             

         

         

         

             

              

         

         

         

             

             

                

         

         

         

         

       

 

         

         

         

         

         

         

         

         

         

       

         

         

             

         

 

         

         

       

         

         

              

       

         

       

         

         

         

         

             

         

         

         

             

          

         

         

         

         

         

         

            

         

         

         

         

          

             

             

         

       

       

       

         

       

         

         

         

            

       

         

         

         

       

                                               

   

 

 

下面是使用CheckStyle检查过得代码

图6

常见错误分析

常见的CheckStyle错误有这些:
1.Type is missing a javadoc commentClass 

缺乏类型说明 
2.“{” should be on the previous line 

“{” 应该位于前一行 
3.Methods is missing a javadoc comment 

方法前面缺乏javadoc注释 
4.Expected 
@throws tag for “Exception” 
在注释中但愿有@throws的说明 
5.“.” Is preceeded with whitespace “.” 

前面不能有空格 
6.“.” Is followed by whitespace“.” 

后面不能有空格 
7.“=” is not preceeded with whitespace 

“=” 前面缺乏空格 
8.“=” is not followed with whitespace 

“=” 后面缺乏空格 
9.“}” should be on the same line 

“}” 应该与下条语句位于同一行 
10.Unused 
@param tag for “unused” 
没有参数“unused”,不需注释 
11.Variable “CA” missing javadoc 

变量“CA”缺乏javadoc注释 
12.Line longer than 80characters 

行长度超过80 
13.Line contains a tab character 

行含有”tab” 字符 
14.Redundant “Public” modifier 

冗余的“public”modifier 
15.Final modifier out of order with the JSL 

suggestionFinal modifier的顺序错误 
16.Avoid using the “.*” form of import 

Import格式避免使用“.*” 
17.Redundant import from the same package 

从同一个包中Import内容 
18.Unused import-java.util.list 

Import进来的java.util.list没有被使用 
19.Duplicate import to line 13 

重复Import同一个内容 
20.Import from illegal package 

从非法包中 Import内容 
21.“while” construct must use “{}” 

“while” 语句缺乏“{}” 
22.Variable “sTest1” must be private and haveaccessor method 

变量“sTest1”应该是private的,而且有调用它的方法 
23.Variable “ABC” must match pattern“^[a-z][a-zA-Z0-9]*$” 

变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$” 
24.“(” is followed by whitespace 

“(” 后面不能有空格 
25.“)” is proceeded by whitespace 

“)” 前面不能有空格

代码重复

PMD介绍

安装PMD 的Eclipse插件

1.      下载地址:

http://jingyan.baidu.com/article/19192ad835de6ee53e57073c.html

2.      解压net.sourceforge.pmd.eclipse-3.2.6.v200903300643.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\pmd,此文件夹下有两个文件夹features、plugins。

3.      咱们使用link的方式安装。在Eclipse的dropins文件夹下新建pmd.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\pmd

4.      关闭Eclipse,重启。而后在Eclipse的window》Preferences下就能够看到PMD菜单,安装成功,以下图

图7

使用PMD

图8

下面是PCD生成的重复代码,能够对其中的代码进行分析,修改

图9

代码覆盖率

Coverlipse介绍

安装coverlipse 的Eclipse插件

1.      下载地址:

https://sourceforge.net/projects/coverlipse/files/Coverlipse/

下载下图中5个文件

图10

1.      解压coverlipse-0.9.6.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\ coverlipse-0.9.6,此文件夹下有两个文件夹features、plugins。

2.      咱们使用link的方式安装。在Eclipse的dropins文件夹下新建coverlipse.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\coverlipse

3.      关闭Eclipse,重启。右键java代码,点击dubug,安装成功,以下图

图11

使用coverlipse

Wait..

Emma介绍

Wait…

依赖项分析

jdepend介绍

安装jdepend 的Eclipse插件

1.      下载地址:

http://andrei.gmxhome.de/jdepend4eclipse/links.html

图12

2.      拷贝de.loskutov.eclipse.jdepend_1.2.4.201406241900.jar文件,到Eclipse的dropins目录下。如:D:\geyouchao\eclipse4.2-xu\dropins。

3.      关闭Eclipse,重启。经过右键单击源文件夹并选择 Run JDepend Analysis。必定要选择一个含源代码的源文件夹;不然看不到此菜单项。

图13

使用jdepend

图14

下面对jdepend的分析的结果简单介绍

图15

 

1.      Selected objects():选择分析的包

2.      Package:包全路径

3.      CC(concr.cl.):当前行对应包的具体类数量

4.      AC(abstr.cl.):当前行对应包的抽象类和接口数量

5.      Ca(aff.):依赖于被分析package的其余package的数量,用于衡量pacakge的职责。即有多少包调用了它。(AfferentCouplings

6.      Ce(eff.):被分析package的类所依赖的其余package的数量,用于衡量package的独立性。即它调用了多少其余包。(EfferentCouplings

7.      A:被分析package中的抽象类和接口与所在package全部类数量的比例,取值范围为01。(Abstractness 

8.      I:I=Ce/CeCa),用于衡量package的不稳定性,取值范围为01I0表示最稳定,I1表示最不稳定。即若是这个类不调用任何其余包,则它是最稳定的。(Instability 

9.      D:分析package和理想曲线AI1的垂直距离,用于衡量package在稳定性和抽象性之间的平衡。(Distance

理想的package要么彻底是抽象类和稳定(x=0,y=1),要么彻底是具体类和不稳定(x=1,y=0)。取值范围为0-1,

D=0表示彻底符合理想标准,

D=1表示package最大程度地偏离了理想标准。即你的包要么全是接口,不调用任何其余包(彻底是抽象类和稳定),要么是具体类,不被任何其余包调用。

10.  Cycle!:循环依赖

11. Package with cycle:包与包直接有循环调用

12. Depends upon-efferentdependencies:依赖的包

13. Used by-afferentdependencies:被引用的包

 

图16

Instability:不稳定

Abstractness:抽象性

问题分析

图17

针对上图中Cycle!列中有感叹号图标问题,是由于以上三个包中的类有传递依赖,故出现此警告。

解决办法:

把其中的某个或者某些类再单独抽出新包,解决此问题。

参考资料

1.      http://www.ibm.com/developerworks/cn/java/j-ap01117/

2.      http://www.clarkware.com/software/JDepend.html

 

 

复杂度监控

metrics(量度)介绍

安装metrics 的Eclipse插件

1.      下载地址:

https://sourceforge.net/projects/metrics/

图18

图19

图20

图21

2.      解压updatesite_1.3.6.zip文件,net.sourceforge.metrics.updatesite文件夹下有features和plugins分别拷贝到Eclipse的对应目录下。如:D:\geyouchao\eclipse4.2-xu\plugins等。

3.      关闭Eclipse,重启。而后在Eclipse的window》Preferences下就能够看到Metrics Preferences菜单,安装成功,以下图

图22

设置metrics参数

下图是metrics提供的配置项,下面对各个配置项进行解释

图23

number of overridden methods

重载方法的数量

number of attributes

属性的数量

number of children

子类的数量

number of classes

类的数量

method lines of code

代码的方法行

number of methods

方法的数量

nested block depth

块嵌套深度

depth of inheritance tree

继承树的深度

number of packages

包的数量

afferent coupling

传入耦合

number of Interfaces

接口的数量

mccabe cyclomatic complexity

McCabe圈复杂度

total lines of code

代码的总行数

instability

不稳定

number of parameters

参数的数量

lack of cohesion of methods

方法缺少凝聚力

efferent coupling

传出耦合

number of static methods

静态方法数

normalized distance

正常距离

abstractness

抽象性

specialization index

专业化指数

weighted methods per class

每类的加权方法

number of static attributes

静态属性数

 

lack of cohesion of methods:

介于0-1之间,0表示最有凝聚力,1表示彻底没有凝聚力。

1)若是全部方法都使用全部的实例字段,一个类是彻底有凝聚力的

2)静态方法和实例方法计数,它还包括构造函数、属性的getter和setter,全部方法。

在Since Sonar 4.1中此量度已经被删除。

3) 子的数量NOC(Number ofchildren)子类在类的层次内,子类能够最直接地从属于一类。随着子类数量的增大,重用也增长了。但父类抽象的表示可能减小,即一些子类可能不是父类真正的成员,同时,测试数量(用来检查每一个子类在操做先后的要求)也将增长。

4) 方法中聚合的不足LCOM(Lack ofcohesion in Methods)

一个类内的每种方法访问一个或多个属性(也称实例变量)。LCOM是访问一个或多个相同属性方法的数量

若是LCOM很大,则说明方法能够经过属性与其余方法耦合,这就增长了类设计的复杂性。一般,对LCOM值很大的类,能够把它分为两个或多个单独的类,这样每一个类能的设计更方便。

这里讲的耦合和聚合与传统软件中讲的是同样的。咱们但愿高聚合和低耦合,即保持低的LCOM.但在某些时候,LCOM很大也是合理的。

5)每一个类的加权方法WMC(Weighted Methodsper Class)

 

6)Out-of-range:超出范围,溢出

 

下面是metric的安全范围设置,在此页面中能够设置每项指标的安全范围。若警告启用,指标值超出咱们设置的安全范围就好发出警告。

图24

 

使用metrics

1.   右键单击您的项目并选择 Properties 菜单。在结果窗口中,选择 EnableMetrics plugin 复选框并单击 OK

图25

2.      从 Eclipse 中选择 Window 菜单打开 Metrics 视图,而后选择 Show View | Other...。

 

3.      选择 Metrics | Metrics View 打开如图 13 中显示的窗口。您须要使用Java 透视图并从新构建项目,从而显示这些度量值。

图26

注:必定要从新构建项目

图27

Java 模拟技术(mock)

Mock是什么

Mock一般是指,在测试一个对象A时,咱们构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是咱们事先设定且符合预期。经过这些Mock对象来测试A在正常逻辑,异常逻辑或压力状况下工做是否正常。

引入Mock最大的优点在于:Mock的行为固定,它确保当你访问该Mock的某个方法时老是可以得到一个没有任何逻辑的直接就返回的预期结果。

Mock Object的使用一般会带来如下一些好处:

 隔绝其余模块出错引发本模块的测试错误。

 隔绝其余模块的开发状态,只要定义好接口,不用管他们开发有没有完成。

 一些速度较慢的操做,能够用MockObject代替,快速返回。

对于分布式系统的测试,使用Mock Object会有另外两项很重要的收益:

 经过Mock Object能够将一些分布式测试转化为本地的测试

 将Mock用于压力测试,能够解决测试集群没法模拟线上集群大规模下的压力

 

mock技术的目的和做用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界之外的对象隔离开。

 

Mock应用场景

在使用Mock的过程当中,发现Mock是有一些通用性的,对于一些应用场景,是很是适合使用Mock的:

 真实对象具备不可肯定的行为(产生不可预测的结果,如股票的行情)

 真实对象很难被建立(好比具体的web容器)

 真实对象的某些行为很难触发(好比网络错误)

 真实状况令程序的运行速度很慢

 真实对象有用户界面

 测试须要询问真实对象它是如何被调用的(好比测试可能须要验证某个回调函数是否被调用了)

 真实对象实际上并不存在(当须要和其余开发小组,或者新的硬件系统打交道的时候,这是一个广泛的问题)

固然,也有一些不得不Mock的场景:

 一些比较难构造的Object:这类Object一般有不少依赖,在单元测试中构造出这样类一般花费的成本太大。

 执行操做的时间较长Object:有一些Object的操做费时,而被测对象依赖于这一个操做的执行结果,例如大文件写操做,数据的更新等等,出于测试的需求,一般将这类操做进行Mock。

 异常逻辑:一些异常的逻辑每每在正常测试中是很难触发的,经过Mock能够人为的控制触发异常逻辑。

在一些压力测试的场景下,也不得不使用Mock,例如在分布式系统测试中,一般须要测试一些单点(如namenode,jobtracker)在压力场景下的工做是否正常。而一般测试集群在正常逻辑下没法提供足够的压力(主要缘由是受限于机器数量),这时候就须要应用Mock去知足。

在这些场景下,咱们应该如何去作Mock的工做了,一些现有的Mock工具能够帮助咱们进行Mock工做。

EasyMock应用

Easymock官网:

http://easymock.org/

 

EasyMock 是早期比较流行的MocK测试框架。它提供对接口的模拟,可以经过录制、回放、检查三步来完成大致的测试过程,能够验证方法的调用种类、次数、顺序,能够令 Mock 对象返回指定的值或抛出指定异常。经过 EasyMock,咱们能够方便的构造 Mock 对象从而使单元测试顺利进行。

 

EasyMock 是采用 MIT license 的一个开源项目

 

使用EasyMock大体能够划分为如下几个步骤:

 

①    使用 EasyMock 生成 Mock 对象;

 

②    录制 Mock 对象的预期行为和输出;

 

③    将 Mock 对象切换到 播放 状态;

 

④    调用 Mock 对象方法进行单元测试;

 

⑤    对 Mock 对象的行为进行验证。

mockito应用

mockito官网

https://code.google.com/p/mockito/

 

因为官网上不了,能够到csdn上下载

http://download.csdn.net/download/wjjiang917/5519381

 

是EasyMock以后流行的mock工具。相对EasyMock学习成本低,并且具备很是简洁的API,测试代码的可读性很高。

 

使用mockito大体能够划分为如下几个步骤:

 

①    使用 mockito 生成 Mock 对象;

 

②    定义(并不是录制) Mock 对象的行为和输出(expectations部分);

 

③    调用 Mock 对象方法进行单元测试;

 

④    对 Mock 对象的行为进行验证。

 

PowerMock应用

PowerMock官网

https://code.google.com/p/powermock/

 

 

这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,好比对static, final, private方法均不能mock。其实测试架构设计良好的代码,通常并不须要这些功能,但若是是在已有项目上增长单元测试,老代码有问题且不能改时,就不得不使用这些功能了。

 

PowerMock 在扩展功能时彻底采用和被扩展的框架相同的API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 很是容易上手。PowerMock 的目的就是在当前已经被你们所熟悉的接口上经过添加极少的方法和注释来实现额外的功能。目前PowerMock 仅扩展了 EasyMock 和 mockito,须要和EasyMock或Mockito配合一块儿使用。

代码评审(review)和重构

Jupiter

 

Wait…

 

参考资料

1.      http://wenku.baidu.com/link?url=HWBo4JC-pLcsC1plz5ZJtvUN8Y4t0WZ1beHiyvSyIFGjCJdpP4gMsnFHhhCRQTXD_-4XC213nEGK7zvgOGUHDG

2.      http://www.ibm.com/developerworks/cn/java/j-ap01117/

3.      http://www.blogjava.net/askcuix/archive/2009/02/08/253775.html

4.      http://www.cnblogs.com/sunzhenchao/archive/2013/06/14/3136140.html

5.      http://tieba.baidu.com/p/4304901637

6.      http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/

7.      http://www.ibm.com/developerworks/cn/java/j-easymock.html

8.      http://www.cnblogs.com/huangbin/archive/2013/04/27/3047671.html

9.       

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜