通用技术 [分享] 自动化测试与持续集成方案-- 代码检查

snake · 2015年05月29日 · 最后由 扮猪吃老鼠 回复于 2017年06月12日 · 988 次阅读

最近一直纠结这个要不要分享出来,毕竟只是一个工具的使用,而且自己使用起来效果不是很好,不是工具不好,是水土不服。个人感觉这个工具还是不错的。

Sonar 简介

Sonar 是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量

通过插件形式,可以支持包括 java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy 等等二十几种编程语言的代码质量管理与检测

sonarQube 能带来什么?

Developers' Seven Deadly Sins
1.糟糕的复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,
且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试

2.重复
显然程序中包含大量复制粘贴的代码是质量低下的
sonar 可以展示源码中重复严重的地方

3.缺乏单元测试
sonar 可以很方便地统计并展示单元测试覆盖率

4.没有代码标准
sonar 可以通过 PMD,CheckStyle,Findbugs 等等代码规则检测工具规范代码编写

5.没有足够的或者过多的注释
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降
而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷

6.潜在的 bug
sonar 可以通过 PMD,CheckStyle,Findbugs 等等代码规则检测工具检测出潜在的 bug

7.糟糕的设计(原文 Spaghetti Design,意大利面式设计)
通过 sonar 可以找出循环,展示包与包、类与类之间的相互依赖关系
可以检测自定义的架构规则
通过 sonar 可以管理第三方的 jar 包
可以利用 LCOM4 检测单个任务规则的应用情况
检测耦合

通过 sonar 可以有效检测以上在程序开发过程中的七大问题。

官网: http://www.sonarqube.org/

Sonar 安装

SonarQube 安装
配置 sonar、jenkins 进行持续审查

实践

如果配置数据库的话,可以看到代码质量的趋势图。如果有单元测试,也可以看到单元测试代码覆盖率。
OK, 开始:
在浏览器中访问: http://localhost:9000/ ,运行界面如下:

不要紧张,技术债务数据看起来比较吓人,但是里面很多问题都是规范性问题,语法问题,很多问题是可以接受的。
蓝色的数据差不多都是可以点击的,你可以看到具体的细节,定位到文件,代码的行。
这里没有单元测试的代码覆盖率,因为没有做。

点击阻断。(确切的说应该是 block,你可以看到如下图:)

点开某个文件,具体信息:

这个平台可以统计单元测试的代码覆盖率,还可以装一些其他的代码检查的插件。也可以跟 jenkins 结合。
还可以自定义一些规则。

从图中可以看出,代码的质量很糟糕,重复的代码太多。而且代码及其不规范。
因为没法 push 开发去改进提高质量,领导也不重视,最后放弃了,这个尝试只是徒劳了。

因为制定 rule 要和开发的老大一条条敲定,根本就没机会跟开发的老大一起做这个事情,自己定义的又不被认可,最后这事不了了之了。

大家可以基于以下的例子来制定:
基于华为 Java 编程规范的 Eclipse checkStyle.xml
利用 Sonar 定制定义 JS 扫描规则
checkstyle rule 模板

小伙伴们,你们的代码如何测试的呢? 开展得怎样?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

关键点就在 rule。 rule 的制定,加上去,给你加精。如果能共享下你们的 rule 就更好了。

@lihuazhang 制定 rule, 因公司而异,可以参照上面添加的内容。
基于华为 Java 编程规范的 Eclipse checkStyle.xml
利用 Sonar 定制定义 JS 扫描规则
checkstyle rule 模板

学到好东西了。

目前正在做持续集成,代码检查工具是公司自研,也会用到 findbugs.checkstyle.pmd 这些。感觉时间做长了反而不知道该怎么走?做持续集成的出路在哪?

#4 楼 @leesom 没多大意思的。代码整洁规范的意义在哪里?领导不关注就没效果,领导关注了但是没产出。投入性价比极低。

想问一下,我部署了 sonar 之后跑出的结果之后代码覆盖率没有单元测试成功率,这个问题博主知道怎么解决吗?

持续集成是很好的保证工程质量的手段, 关键是要落地。
跑一堆数据放在那是无用的, 而是要加入到开发的流程中去。
我现在做的是, 把这些数据放到 CR 的 comments 及邮件提醒等等。

# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=root
sonar.jdbc.password=root

#----- Embedded Database (default)
# It does not accept connections from remote hosts, so the
# server and the analyzers must be executed on the same host.
# sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar

# H2 embedded database server listening port, defaults to 9092
# sonar.embeddedDatabase.port=9092


#----- MySQL 5.x
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

你好,我装好了 mysql,同时也设置了 sonar.properties 配置文件,但是启动的时候,打不开http://localhost:9000/
如果把这些配置加上 # 就可以启动http://localhost:9000/

#sonar.jdbc.username=root
#sonar.jdbc.password=root
#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

请问是我哪里配置错误了吗?

smithallen 回复

同意,很多公司都在搞,真正落地的很少吧

基于华为 Java 编程规范的 Eclipse checkStyle.xml 这个导入 sonar 报错。。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册