一小时写给同组的如何使用工具检测代码质量

简介: <div class="markdown_views"><p>因为要做个小项目,同组的同事都比较年轻,为了规范下代码,因此简单的写了下怎么提高代码质量,分享一下:</p><h3 id="在接口不通的情况下进行单元测试"><strong>在接口不通的情况下进行单元测试</strong></h3><p>使用Mockito, 如果获取余额部分代码为:</p><pre

因为要做个小项目,同组的同事都比较年轻,为了规范下代码,因此简单的写了下怎么提高代码质量,分享一下:

在接口不通的情况下进行单元测试

使用Mockito, 如果获取余额部分代码为:

public class PayServiceImpl implements PayService {
    private BizPayService bizPayService;
    @Override
    public BigDecimal getBalance(String pin) {
        try {
            return bizPayService.getBalace("", 0);
        } catch (BizVirtualPayException e) {
             e.printStackTrace();
        }
        return null;
    }
    public void setBizPayService(BizPayService bizPayService) {
           this.bizPayService = bizPayService;
    }
}

bizPayService为一个dubbo接口,如果没有提供,那么测试代码如下:

public class PayServiceTest {
    @Test
    public void testGetBalance() throws BizVirtualPayException{
        PayServiceImpl payService = new PayServiceImpl();
        BizPayService bizPayService = mock(BizPayService.class);
        when(bizPayService.getBalace("", 0)).thenReturn(new BigDecimal(20.00));
        payService.setBizPayService(bizPayService);
        Assert.assertEquals(20.00, payService.getBalance("").doubleValue(), 0);
    }
}

单元测试覆盖率

  • 安装Eclemma, 安装包点击这里下载
  • 安装后在eclipse中:
    这里写图片描述
    多了最左侧的图标
  • 对测试代码右键Coverage as进行执行,执行完后:
    这里写图片描述
    显示该测试代码覆盖率
  • 展开可见:
    这里写图片描述
  • 红色为未覆盖部分,说明该处代码没有测试到可能存在隐患

代码质量三驾马车之一-findbugs

静态代码缺陷检测工具
1. 对代码击右键,选择FindBugs->FindBugs,我们的开发环境中一般内置了该插件
2. 执行完成后,在代码根目录会显示找到的缺陷个数如图:
这里写图片描述
3. 打开对应的类,在左边框有如下的图标,点之:
这里写图片描述
4. 下面会出现具体的说明:
这里写图片描述
5. 对字段进行说明
Confidence 是造成缺陷的可能性, 一般为High的必须解决,这里是因为日志过滤其中使用了静态变量,而用实例方法对静态变量有可能导致并发的问题。
6. 要求
Confidence 为Hign的必须解决。
其他Confidence的必须理解其可能会造成的影响,确定不会影响系统运行时可以不解决
7. 常见问题

  • 缺少空指针检查 这个不仅会造成代码缺陷,还会减少性能,因为不显示的检查空指针,JVM会动态的加进去这部分内容
  • 打开资源没有在finally中关闭
  • 冗余空指针检查 紧接着new 之后进行空指针检查,是没有必要的
  • try{}catch空指针 通常我们的代码如下:Connection conn = null; try{conn = ..}catch(Exception e){}finally{conn.close}这个时候这个conn有可能为空。
  • 用==比较对象 我们出现过这个问题,用==比较Integer导致bug

    • 成员变量和局部变量同名 会导致变量被覆盖

    代码质量三架马车之二-CheckStyle

    1. 对代码击右键
    2. Window->Show view-> CheckStyle->Checkstyle violations打开一个新的View,有所有代码规范有问题的列
      这里写图片描述
    3. 常见问题
      这个工具只有代码规范和风格的检查,一般我们需要注意:
      • 空行, 删除
      • 关键字之间的空格 要加,加上代码好看
      • 注解相关 可以忽略
      • 注释 后面单说
      • 命名 常量名, 变量名,方法名。 这个要改,不改不专业
      • 类长 要改,太长的类说明设计有问题
      • 行长 可以通过设置eclipse Ctrl+F的动作来改
      • 方法长 要改,太长说明设计有问题
      • equals hashCode必须同时覆盖 这个要看HashMap的hash算法的源码部分才能理解为什么

代码质量三家马车之三-PMD

比CheckStyle功能更强的静态代码检查工具,主要是检查一些日常编码中我们经常犯的错误,比如String,StringBuffer的滥用, 复杂度等
1. 右击代码
这里写图片描述
2. 如上左侧的小图标表示了级别, 带红x的必须解决, 其他的酌情而定
3. 常见问题

  • 空方法 常见于策略,模板等模式的实现中,有的子类没有实现该方法, 这个说明算法设计有问题
  • overriden注解 要加,可以利用eclipse的静态分析功能编译器发现问题
  • System.out.println 要用日志代替,效率极低
  • 抛出JDK自带异常 要用自定义异常代替
  • 复杂度 我们定位不超过12
  • could be final 忽略,这个工具想让我们把所有的变量都加上final,没有必要
  • 没有用泛型 尽量使用
  • 单return 忽略
  • e.printStackTrace() 改为日志打印

注释要求

  1. public 方法必须含有详细注释
  2. private 方法用小方法自注释的风格保证可读性及可维护性
  3. 对外开放API接口要包括包注释
  4. 注释中方法有复杂算法的要进行说明
  5. 分支语句要加注释
  6. 要保证注释中的内容必须与代码逻辑是一致的
  7. 注释要对所有入参进行说明,说明取值范围,边界值,是否允许为空等
  8. 注释要对出参进行说明,特别是集合的情况,要说明该集合是否有肯能为null,如果没有,则用户不用再判空
  9. 注释对异常进行说明,说明可检异常在什么情况下会抛出
  10. 注释要占代码行数的20%左右,尽量达到

补充说明

  1. TDD。
    敏捷开发最佳实践之一: 测试驱动开发。(这个有机会跟大家分享下)
    这是单元测试的一个目的。 先写单元测试,用assert来确定方法的返回结果。在开发代码的时候要注意满足这个期望的结果永远是正确的,有利于设计接口,以及保持正确的返回值。
  2. 减少不用代码
    减少复制粘贴来的大量不用代码。比如BizMessage中所使用到的APIUtils及JSONUtils 这两个类。 其中设计了JSON字符串的处理,但是实际上使用阿里巴巴的FastJSON可以直接满足要求,直接替换之,这样就不用为了这两个类写单元测试了。
    在未他们写单元测试的时候才会发现他们的方法有大量没有使用的部分。
    并且因为写单元测试进行覆盖率的增长是一件很麻烦的事情,会促进大家尽量写行数少的代码,以减少单元测试代码的工作量。

  3. 发现设计问题
    在进行单元测试的时候难避免使用mock技术,当你发现一个类不好mock的时候,那么说明该类在设计上存在问题,具有不可测试性,这样的类应该修改。

  4. 检查代码逻辑错误
    使用覆盖率工具能够检查出大量分支为红色的部分,这个说明我们的单元测试没有测试带该异常分支。同样的,我们的生产环境该分支可能是存在问题的,需要修改。
  5. 单元测试就是对外API文档
    好的单元测试可以看做是一份接入我们API的客户端文档,比如我们写API的使用说明的时候,就可以按照我们单元测试的逻辑来写
相关文章
|
存储 Java
使用Java进行Base64编码的示例
使用Java进行Base64编码的示例
269 1
|
1月前
|
JavaScript 安全 前端开发
如何开发人事及OA管理系统的薪酬管理板块?(附架构图+流程图+代码参考)
本文介绍了如何构建一个高效、合规的企业薪酬管理系统,涵盖薪酬模块的重要性、核心功能、系统架构设计、数据模型、开发实现及安全合规要点。内容包括薪酬配置、数据导入、自动化计算、审批发放、工资条生成与安全分发、报表看板、权限审计等关键环节,并提供详细的业务流程、架构图、核心代码示例及落地开发技巧。适用于HR、财务及技术人员快速搭建薪酬管理系统,提升发薪效率,降低人工错误与合规风险。
|
1月前
|
存储 Linux Shell
ESXi安装openwrt
在 ESXi 虚拟化环境下安装 OpenWrt 是一个常见的需求,特别是用于搭建虚拟路由器、网络测试等。下面给你详细步骤指导,帮你在 VMware ESXi 上成功安装并运行 OpenWrt 虚拟机。
|
1月前
|
Kubernetes 安全 Devops
「迁移急救包」全云平台无缝迁移云效实操手册
阿里云云效是国内领先的一站式DevOps平台,提供代码全生命周期管理、智能化交付流水线及精细化研发管控,支持多种开发场景。本文详细介绍了从其他平台(如Coding)向云效迁移的完整方案,包括代码仓库、流水线、制品仓库及项目数据的迁移步骤,帮助用户实现高效、安全的平滑迁移,提升研发效率与协作能力。
377 29
|
6月前
|
人工智能 小程序 算法
【01】AI制作音乐之三款AI音乐软件推荐,包含AI编曲-AI伴奏-AI混音合成remix等-其次关于音乐版权的阐述-跟随卓伊凡学习如何AI制作音乐-优雅草卓伊凡
【01】AI制作音乐之三款AI音乐软件推荐,包含AI编曲-AI伴奏-AI混音合成remix等-其次关于音乐版权的阐述-跟随卓伊凡学习如何AI制作音乐-优雅草卓伊凡
993 14
|
安全 Shell 网络安全
【专栏】通过SSH在远程和本地系统间传输文件的主要四种方法
【4月更文挑战第28天】本文介绍了通过SSH在远程和本地系统间传输文件的四种方法:1) SCP,适用于熟悉命令行的用户;2) SFTP,提供更丰富的文件管理功能;3) SSHFS,可将远程文件系统挂载至本地;4) 图形化工具,如FileZilla和WinSCP,操作简便。根据需求、技能水平和系统环境选择合适的方法,并注重安全设置以确保文件传输的安全可靠。
4872 7
|
11月前
|
机器学习/深度学习 存储 算法
探讨深度学习在图像识别中的应用及优化策略
【10月更文挑战第5天】探讨深度学习在图像识别中的应用及优化策略
178 1
在Uniapp应用开发中遇到的问题、错误代码与解决方案汇总
在Uniapp应用开发中遇到的问题、错误代码与解决方案汇总
923 0
|
机器学习/深度学习 数据采集 算法
基于深度学习的图像识别优化策略
【5月更文挑战第26天】 在现代技术景观中,图像识别已变得不可或缺,其应用范围从医疗诊断到自动驾驶汽车。然而,准确性和速度的提升一直是该领域的持续挑战。本文提出了一种基于改进的卷积神经网络(CNN)架构的图像识别优化策略,旨在通过减少网络复杂度和计算量来提高处理速度,同时保持甚至提升识别精度。我们采用了一种新颖的数据预处理方法,结合了数据增强和噪声过滤技术,以及一个轻量化的网络设计,减少了参数数量并优化了特征提取过程。此外,我们还引入了一个高效的激活函数,以改善模型在不同层之间的信息传递效率。实验结果表明,与现有技术相比,我们的优化策略在多个标准数据集上实现了显著的性能提升,包括在ImageN

热门文章

最新文章