持续集成:代码审查篇

栏目: 服务器 · 发布时间: 5年前

内容简介:一般认为,代码复查、结对编程和静态分析如果能够严格执行,对提高代码的总体品质是有好处的。在快速、成功地执行无尽的、重复的任务时,人的能力是有限的,采用静态分析工具执行审查逐渐成为共识,它主要有以下优点:1)工具运行成本低,只需要人工配置并执行一次,此后可自动执行,节省了很多人力2)工具审查比人工审查更理性客观

一般认为,代码复查、结对编程和静态分析如果能够严格执行,对提高代码的总体品质是有好处的。在快速、成功地执行无尽的、重复的任务时,人的能力是有限的,采用静态分析 工具 执行审查逐渐成为共识,它主要有以下优点:

1)工具运行成本低,只需要人工配置并执行一次,此后可自动执行,节省了很多人力

2)工具审查比人工审查更理性客观

利用工具进行自动化代码审查解决80%的问题,让人来处理另外20%的重要问题,自动化审查可以让人工复查变得更有效,代码底层已经通过扫描检查,人工复查可以关注那些自动化不能处理的方面,如代码是否满足需求,是否从长远来看易于维护等。

审查及其价值

测试是动态的,它执行软件,目的是测试功能。测试包括:单元测试、组件测试、系统测试等。

审查是基于一组预先定义的规则分析代码,由确定的标准指导。包括:编码的“语法”、标准架构分层遵守、重复代码等。

测试和审查是相似的,它们都不会修改代码,只是指出问题可能出现在哪里。

如果缺陷在进入代码后几个月才被发现,错失了时间,问题的上下文环境也记不清了。如果采用工具监控,缺陷可能在几分钟内就被发现和修复,无疑将在很大程度上改进代码质量。

而且,用写代码行数来度量开发工作者的生产效率是不客观的,有些代码测量指标包括了注释,且这种测量方式助长了复制粘贴之风。代码审查的引入可以为解决这一问题提供方法。

持续审查可以减少发现问题和修复问题之间的时间,确定系统中需要特别关注的部分。在CI系统中执行持续自动化审查,可以积极地预防缺陷,并确保一种可重复和一致的方式。

降低代码复杂度

圈复杂度值(CCN),是通过一个方法的执行路径数来衡量复杂性成为一个测量指标,通常是一个整数值。研究表面代码的路径和缺陷之间存在关系。CNN大于10的代码比其他同样规模的代码存在缺陷风险更大。

通过执行审查工具,通常会得到以下报告内容:

1)类、方法、非注释代码行及各种风格注释行数目

2)类中非注释代码行、方法、内部类和注释的数目

3)总体代码的非注释代码行数和圈复杂度

前文曾说,圈复杂度高通常表示缺陷风险高,得到表格后,检查是否存在对应的测试:

1)如果有测试,让测试数目与圈复杂度相等

2)如果没有相关测试,立刻编写一些测试,通过重构降低风险

降低圈复杂度最有效的方法是使用“提取方法技术”,将复杂度分解到更小、更可管理、更可测试的方法中去。

如果发现审查报告中显示CCN值一直在增长,可以采用以下方法:

1)提供足够数量的相关测试,减少风险

2)评估重构的可能性,减少长期维护的问题

可以在自动化构建的过程中执行这些审查,自动化确定代码中复杂度较高的部分,进行改善。

持续进行设计复查

当某对象与其他对象存在依赖关系,一个依赖关系发生变化,这个对象就可能出现问题,“传入耦合”和“传出耦合”有助于确定过度耦合情况。

不稳定性=传出耦合/(传出耦合+传入耦合)

值为0表示稳定,1为不稳定。

传入耦合高的对象会造成破坏,传出耦合高的配件则会受到破坏,为配件编写足够的测试,到达一定代码覆盖率有助于快速定位问题。监控时发现耦合有大量增加的趋势,可以采取下面措施:

1)根据发现的风险立即创建测试

2)评估耦合可能对脆弱性带来的长期影响

3)执行测试后,考虑通过重构令将来的修改更为方便

维持编码标准

编码标准有利于不同团队不同开发者对代码的共同理解。代码结构的标准化使不同人可以快速判断代码的行为,并进行需要的修改,在开发过程中响应更快,减少对必要人员或团队的依赖。

项目编码标准过多,包括条件语句中括号位置、命名惯例、设计惯例等,要求熟读并牢记这些标准对于开发者来说有很大压力,而且在工作过程中容易忘记,采用工具监督,可以在遇到对应问题的时候及时检查相应条例,及时修改。

CI过程中,代码分析工具可以在项目的版本控制库发生变更时就执行。在文件、结构或其他系统发生变更时分析全部代码,通过反馈机制及时通知到相关人员。通过持续地监控和审查代码,可以使团队保持遵守架构和编码指南,问题可以早发现、常发现,从而避免长期维护的问题。

减少重复代码

复制粘贴代码的现象总是存在的,而且通常问题是开发者根本没意识到自己正在做这种事,复制粘贴出现时的情况通常有:

1)数据库逻辑,包括存储过程和视图

2)编译的源代码

3)解释的源代码

4)构建脚本

5)数据和配置文件

可能导致以下问题:

1)增加维护成本、需要多次发现、报告、分析和修复缺陷

2)不确定是否存在其他缺陷

3)对额外编写的代码增加了测试成本

通过自动化审查工具,可以找出代码里重复的部分,得到代码的重复率,从而减少这些隐患。

判断代码覆盖率

判断代码覆盖率有不同的覆盖率测试方法。大多数方法只关注“行覆盖率”(语句覆盖率),其实这只能表明代码行被执行过,即:10行代码其中有7行在测试中得到执行,这个方法的行为覆盖率为70%

有些工具也提供“分支覆盖率”,尝试测量判断点的覆盖率。对于分支覆盖率报告来说,如果存在两个分支,测试过程中两个分支都执行到了,那么可以说这个方法的分支覆盖率为100%。

监控覆盖率报告可以帮助开发团队快速定位那些新写的、没有对应测试的代码。比如之前的覆盖率达70%,本周更新包的覆盖率变成60%,可以判断:

1)包的代码行数增加了,但新代码没有编写相应的测试(或新测试没有有效覆盖新代码)

2)有些测试用例被删除了

评估代码质量

1)覆盖率检查频次

代码覆盖率工具为了能生成报告,都会在源代码上稍作修改,成为“监听者”,需要消耗的时间稍长,可以把执行代码覆盖率的工具作为次级构建。

由于测试会分为不同阶段,单元、组件测试发生比较频繁,结合代码审查不太合适。可以在系统测试执行之后再执行另外一套测试,这时打开覆盖率检查开关,在下班后或夜晚执行。

2)覆盖率与性能

覆盖率测试过程会影响测试性能,建议不要同时执行性能测试、压力测试、负载测试。

实践自检

1)测试是定期、偶尔还是持续执行?是否有配合覆盖率检查?

2)是否在监控代码的复杂度?

3)是否运用工具持续进行自动化的设计复查?

4)是否监控代码的重复情况?

5)是否能判断当前代码覆盖率?如果根据数据反馈进行处理?

6)构建过程是否产生覆盖率报告?


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

那些让文案绝望的文案

那些让文案绝望的文案

小马宋 / 北京联合出版公司 / 2015-10 / 45

什么文案60年前就在使用互联网思维? 什么文案让一辆小车在崇尚大车的国度畅销不衰? 什么文案让做文案的人产生“既生瑜何生亮”的绝望? 没错,它是甲壳虫。 远在上世纪五六十年代,这些文案让这辆不起眼的小车畅销不衰。 它的文案风趣而又言之凿凿,它的文案机智而又无可辩驳。 它充满自黑精神,善于借势时事热点,懂得乖巧卖萌,也是天生的段子手。 为了让国内读者一睹这一......一起来看看 《那些让文案绝望的文案》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换