golang静态代码检查_GO语言静态代码测试---应用于区块链构建性测试

背景

随着区块链的这2年的快速发展,Go语言和针对GO语言测试工具也越来越完善,特别是Go语言的静态代码扫描工具完善,使GO语言和JAVA语言一样可以静态代码自动扫描测试。说GO语言静态代码测试之前先说说静态代码测试。

静态代码测试

静态代码测试在不执行计算机程序的条件下,对源代码进行分析,找出代码缺陷。

静态代码测试检测类型:死锁,空指针,资源泄露,缓冲区溢出,安全漏洞,竞态条件。

静态代码测试优点:

1、能够检测所有的代码级别的可执行路径组合,快速,准确。

2、直接面向源码,分析多种问题

3、在研发阶段开始找到并修复多种问题,节省大量时间/人力成本

静态代码测试缺点

1、高误报率:目前静态分析产品的误报率普遍在30%以上。

2、缺陷种类较少,找到的问题级别不高:多数为代码规范或低级缺陷,3、非实际Bug – 如命名规范、类定义规范,最佳实践.....

GO语言静态扫描测试工具

目前Go语言主流静态代码扫描测试工具主要是GoReporte和sonar集成的sonar-golang插件

GoReporte: 一个用于执行静态分析,单元测试,代码审查并生成代码质量报告的Golang工具,这是一个运行一整套静态代码扫描测试流程工具类似于lint静态扫描分析工具,并将其输出标准化为报表的工具。

Sonar-golang:它在SonarQube仪表板中集成了GoMetaLinter报告。 用户必须使用checkstyle格式为其代码生成GoMetaLinter报告。 该报告因此使用Sonar-golang集成到SonarQube中。

SonarQube原理

从上图中可以知道SonarQube可以做持续集成静态代码扫描分析也可以和IDE Integrotion工具集成实现程序员边写代码边进行静态代码分析,提高程序代码质量。

sonar-golang集成GoMetaLinter工具介绍

GoMetaLinter此工具基本集成目前GO语言所有的检测工具,然后可以并发的帮你静态分析你的代码。详细情况看https://github.com/alecthomas/gometalinter常用功能介绍如下:

go vet -工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。

go tool vet --shadow -用来检查作用域里面设置的局部变量名和全局变量名设置一样导致全局变量设置无效的问题

gotype -类型检测用来检测传递过来的变量和预期变量类型一致

gotype -x -在外部的测试包里进行语法和语义分析

deadcode -会告诉你哪些代码片段根本没用

gocyclo -用来检查函数的复杂度

golint -是类似javascript中的jslint的工具,主要功能就是检测代码中不规范的地方变量名规范,变量的声明,像var str string = “test”,会有警告,应该var str = “test”,大小写问题,大写导出包的要有注释x += 1 应该 x++

varcheck -发现未使用的全局变量和常量

structcheck -发现未使用的 struct 字段

maligned - 那些struct 结构体的字段没有排序,排好序的话,占的内存少

errcheck -检查是否使用了错误返回值

megacheck - 这个写代码的时候idea 就提示了

gosimple -提供信息,帮助你了解哪些代码可以简化

Dupl-检查是否有重复的代码

ineffassign -检测不使用变量

Interfacer -建议可以使用更细的接口。

unconvert -检测冗余类型转换

goconst -会查找重复的字符串,这些字符串可以抽取成常量。

gas - 用来扫描安全性问题 (Go的AST注入)

safesql -Golang静态分析工具,防止SQL注入

GoMetaLinter默认是没有打开的功能有testify、test、gofmt -s、goimports 、gosimple 、lll、misspell 、nakedret 、unparam 、unused、safesql 、staticcheck要是打开下面功能需要用参数--enable=方式。

sonar-golang集成go test单元测试

在进行GO单元测试前,必须了解go语言单元测试规则和编译方式方可进行单元测试,只有遵循这些单元规则才能把报告集成到sonar里面

规则

文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码

你必须import testing这个包

所有的测试用例函数必须是Test开头

测试用例会按照源代码中写的顺序依次执行

测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态

测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。

函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。

编译方式

go test .编译当前文件夹所有test测试用例(注意go test 后面的点)

go test -p 编译这个包测试

go test -v 打印测试信息(默认不打印测试通过信息)

如Test_test.go

package gotest

import (

"testing"

)

func Test_Division_1(t *testing.T) {

if i, e := Division(6, 2); i != 3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值