返回顶部
首页 > 资讯 > 后端开发 > GO >Golang模糊测试工具如何使用
  • 956
分享到

Golang模糊测试工具如何使用

2023-07-05 09:07:56 956人浏览 薄情痞子
摘要

本篇内容介绍了“golang模糊测试工具如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发环境升级到Go 1.18Go 1.18虽然

本篇内容介绍了“golang模糊测试工具如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

开发环境

升级到Go 1.18
Go 1.18虽然还没正式发布,但可以下载RC版本,而且即使你生产环境用是Go的老版本,你个人的本地开发环境也可以升级到1.18,还可以使用go-fuzzing更好的自测

go-fuzzing

官方文档:go fuzzing是通过持续给一个程序不同的输入来自动化测试,并通过分析代码覆盖率来智能的寻找失败的例子。这种方法可以尽可能的找到一些边界问题,亲测确实发现的都是些平时比较难发现的问题。

fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。

fuzz tests规则

func FuzzFoo(f *testing.F) {    f.Add(5, "hello")    f.Fuzz(func(t *testing.T, i int, s string) {        out, err := Foo(i, s)        if err != nil && out != "" {            t.Errorf("%q, %v", out, err)        }    })}
  • 函数必须是Fuzz开头,唯一的参数只有*testing.F,没有返回值

  • Fuzz tests必须在名为*_test.go的文件下才能执行

  • fuzz target是个方法,它调用(*testing.F).Fuzz,第一个参数是 *testing.T,之后的参数就是称之为fuzzing arguments的参数,方法没有返回值

  • 每个fuzz test中只能有一个fuzz target

  • 调用f.Add()的时候需要参数类型跟fuzzing arguments顺序和类型都保持一致

  • fuzzing arguments只支持以下类型:

    • int, int8, int16, int32/rune, int64

    • uint, uint8/byte, uint16, uint32, uint64

    • string, []byte

    • float32, float64

    • bool

如何使用go-fuzzing

首先要先定义fuzzing arguments,并通过fuzzing arguments写fuzzing target

思考fuzzing target怎么写,重点是怎么验证结果的正确性,因为fuzzing arguments是随机给的,所以要有个验证结果的方法

遇到失败的例子怎么去打印出错误结果

根据错误结果去生成新的测试用例,这个新的测试用例会被用来调试发现的bug,并且可以留下给CI使用

下面是一个切片中数字求和的例子:

// slice_sum.gofunc SliceSum(arr []int64) int64 {  var sum int64  for _, val := range arr {    if val % 100000 != 0 {      sum += val    }  }  return sum}

定义fuzzing arguments模糊参数

至少需要给出一个fuzzing arguments,不然go-fuzzing没法生成测试代码。
这是切片中元素求和的方法,那我们可以把切片的元素个数n(自行模拟个数即可)作为fuzzing arguments,然后go-fuzzing会根据运行的代码覆盖率自动生成不同的参数来模拟测试。

// slice_sum_test.gofunc FuzzSliceSum(f *testing.F) {  // 10,go-fuzzing称之为语料,10这个值就是让go fuzzing冷启动的一个值,具体多少不重要  f.Add(10)  f.Fuzz(func(t *testing.T, n int) {      // 限制20个元素    n %= 20    // 剩余处理  })}

编写fuzzing target

重点是编写可以验证的fuzzing target,不仅要根据给定的模糊参数写出测试代码,而且还需要生成可以验证结果正确性的数据。
对这个切片元素求和的方法来说,就是随机生成n个元素的切片,然后进行求和得到正确的结果。

package fuzzimport (    "GitHub.com/stretchr/testify/assert"    "math/rand"    "testing"    "time")// slice_sum_test.gofunc FuzzSliceSum(f *testing.F) {  // 初始化随机数种子  rand.Seed(time.Now().UnixNano())  // 语料  f.Add(10)  f.Fuzz(func(t *testing.T, n int) {    n %= 20    var arr []int64    var expect int64 // 期望值    for i := 0; i < n; i++ {      val := rand.Int63() % 1000000      arr = append(arr, val)      expect += val    }    // 自己求和的结果和调用函数求和的结果比对    assert.Equal(t, expect, SliceSum(arr))  })}

执行模糊测试

➜  fuzz go test -fuzz=SliceSum
fuzz: elapsed: 0s, gathering baseline coverage: 0/52 completed
fuzz: elapsed: 0s, gathering baseline coverage: 52/52 completed, now fuzzing with 8 workers
fuzz: elapsed: 0s, execs: 9438 (34179/sec), new interesting: 2 (total: 54)
--- FaiL: FuzzSliceSum (0.28s)
    --- FAIL: FuzzSliceSum (0.00s)
        slice_sum_test.go:32: 
                Error Trace:    slice_sum_test.go:32
                                                        value.go:556
                                                        value.go:339
                                                        fuzz.go:337
                Error:          Not equal: 
                                expected: 5715923
                                actual  : 5315923
                Test:           FuzzSliceSum
    
    Failing input written to testdata/fuzz/FuzzSliceSum/8e8981ffa4ee4d93f475c807563f9d63854a6c913cdfb10a73191549318a2a51
    To re-run:
    go test -run=FuzzSliceSum/8e8981ffa4ee4d93f475c807563f9d63854a6c913cdfb10a73191549318a2a51
FAIL
exit status 1
FAIL    demo/fuzz       0.287s

上面这段输出,你只能看出预期值和实际值不一样,但是很难分析错误。

打印出错误的例子

上面的错误输出,如果能打印出造成错误的例子的话,就可以直接作为测试用例进行单测。我们总不能一个个去试吧,而且错误的例子未必只有一个。

修改下模糊测试代码,增加打印:

package fuzzimport (    "github.com/stretchr/testify/assert"    "math/rand"    "testing"    "time")// slice_sum_test.gofunc FuzzSliceSum(f *testing.F) {    // 初始化随机数种子    rand.Seed(time.Now().UnixNano())    // 语料    f.Add(10)    f.Fuzz(func(t *testing.T, n int) {        n %= 20        var arr []int64        var expect int64 // 期望值        var buf strings.Builder        buf.WriteString("\n")        for i := 0; i < n; i++ {            val := rand.Int63() % 1000000            arr = append(arr, val)            expect += val            buf.WriteString(fmt.Sprintf("%d,\n", val))        }        // 自己求和的结果和调用函数求和的结果比对        assert.Equal(t, expect, SliceSum(arr), buf.String())    })}

再次执行模糊测试

➜  fuzz go test -fuzz=SliceSum
fuzz: elapsed: 0s, gathering baseline coverage: 0/47 completed
fuzz: elapsed: 0s, gathering baseline coverage: 47/47 completed, now fuzzing with 8 workers
fuzz: elapsed: 0s, execs: 17109 (42507/sec), new interesting: 2 (total: 49)
--- FAIL: FuzzSliceSum (0.41s)
    --- FAIL: FuzzSliceSum (0.00s)
        slice_sum_test.go:34: 
                Error Trace:    slice_sum_test.go:34
                                                        value.go:556
                                                        value.go:339
                                                        fuzz.go:337
                Error:          Not equal: 
                                expected: 7575516
                                actual  : 7175516
                Test:           FuzzSliceSum
                Messages:       
                                92016,
                                642504,
                                400000,
                                489403,
                                472011,
                                811028,
                                315130,
                                298207,
                                57765,
                                542614,
                                136594,
                                351360,
                                867104,
                                918715,
                                515092,
                                665973,
    
    Failing input written to testdata/fuzz/FuzzSliceSum/9191ba4d7ea5420a9a76661d4e7d6a7a4e69ad4d5d8ef306ff78161a2acf1416
    To re-run:
    go test -run=FuzzSliceSum/9191ba4d7ea5420a9a76661d4e7d6a7a4e69ad4d5d8ef306ff78161a2acf1416
FAIL
exit status 1
FAIL    demo/fuzz       0.413s

根据输出的错误例子,编写新的测试用例进行单测

// 单测通过后,再执行模糊测试,看看有没有其他边缘问题出现func TestSliceSumFuzzCase1(t *testing.T) {    arr := []int64{        92016,        642504,        400000,        489403,        472011,        811028,        315130,        298207,        57765,        542614,        136594,        351360,        867104,        918715,        515092,        665973,    }    // 期望值从第三步的输出中获取    assert.Equal(t, int64(7575516), SliceSum(arr))}

这样就可以很方便的进行调试了,并且能够增加有效的测试用例进行单测,确保这个bug不会出现了。

生产环境项目Go版本问题

线上项目的Go版本不能升级到1.18怎么办?

线上的版本不升级到1.18,但是我们本地开发升级没有问题,可以在文件的头部增加如下命令注释:

slice_sum_test.go

//go:build go1.18// +build go1.18

这样我们在线上不管用哪个版本都不会报错,而且我们一般都是在本地进行模糊测试

注意:第三行必须是空行,不然就会变成package的注释了

有些还无法复现的问题,比如协程死,输出一直在执行或者卡住然后过一会才结束,这类的长时间执行的模糊测试,我还没有摸透。如果有大佬知道的话麻烦也告诉我下。

“Golang模糊测试工具如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang模糊测试工具如何使用

本文链接: https://lsjlt.com/news/350858.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang模糊测试工具如何使用
    本篇内容介绍了“Golang模糊测试工具如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发环境升级到Go 1.18Go 1.18虽然...
    99+
    2023-07-05
  • Golang之模糊测试工具的使用
    目录背景开发环境go-fuzzingfuzz tests规则如何使用go-fuzzing生产环境项目Go版本问题背景 我们经常调侃程序员每天都在写bug,这确实是事实,没有测出bug...
    99+
    2023-03-06
    Golang 模糊测试 Golang 模糊测试工具
  • 模糊测试工具Simple Fuzzer有什么用
    这篇文章将为大家详细讲解有关模糊测试工具Simple Fuzzer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。模糊测试工具Simple Fuzzer模糊测试是一种不同于渗透测试的漏洞检测方式。它...
    99+
    2023-06-04
  • Web模糊测试工具Powerfuzzer有什么用
    这篇文章主要介绍了Web模糊测试工具Powerfuzzer有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Web模糊测试工具PowerfuzzerPowerfuzzer...
    99+
    2023-06-04
  • cypress测试工具如何使用
    本篇内容主要讲解“cypress测试工具如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“cypress测试工具如何使用”吧!一、什么是cypressCypress称自己是下一代的web前端...
    99+
    2023-06-30
  • 网站模糊测试爆破工具Wfuzz有什么用
    这篇文章给大家分享的是有关网站模糊测试爆破工具Wfuzz有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。网站模糊测试爆破工具Wfuzz模糊测试爆破使用模糊测试的方式对HTTP请求中的各个参数同时进行猜测爆破...
    99+
    2023-06-04
  • iOS testFlight测试工具如何使用
    使用iOS TestFlight测试工具的步骤如下:1. 开发者在App Store Connect中创建App的测试版本。在App...
    99+
    2023-09-29
    iOS
  • 如何使用Apache压力测试工具
    这篇文章将为大家详细讲解有关如何使用Apache压力测试工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下载进入apache官网 http://httpd.apache.org/ 下载apache即可启...
    99+
    2023-06-14
  • 如何使用jmeter压力测试工具
    今天就跟大家聊聊有关如何使用jmeter压力测试工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是压力测试顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行...
    99+
    2023-05-31
    jmeter
  • MySQL中如何使用压力测试工具
    这篇文章主要为大家展示了MySQL中如何使用压力测试工具,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。一、MySQL自带的压力测试工具——Mysqlslapm...
    99+
    2024-04-02
  • Go单元测试工具gomonkey如何使用
    使用Go单元测试工具gomonkey,可以模拟函数的返回值、修改函数的行为,以及捕获函数的调用参数等。下面是使用gomonkey的基...
    99+
    2023-08-08
    Go gomonkey
  • 如何使用开源测试工具RunnerGo做自动化测试
    以下是使用开源测试工具RunnerGo进行自动化测试的步骤:1. 安装RunnerGo:首先,需要从RunnerGo的官方网站(ht...
    99+
    2023-09-21
    RunnerGo
  • Android测试工具-MONKEY使用
    使用monkey测试工具前,需先安装adb命令 MAC下ADB安装 下载:https://www.androiddevtools.cn/inde...
    99+
    2022-06-06
    android测试工具 工具 Android
  • 如何使用IOS自动化测试工具UIAutomation
    目录第一部分: 熟悉Instruments的UIAutomation.第二部分: 控件的获取及操作第三部分: 自定义自动化脚本xcode中自带的Instuments工具可以用来进行A...
    99+
    2022-05-30
    IOS UIAutomation 测试工具
  • Linux中如何使用stress压力测试工具
    Linux中如何使用stress压力测试工具,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。参数说明:-        显...
    99+
    2023-06-16
  • 如何在PHP中使用HTTP负载测试工具?
    PHP是一种广泛使用的编程语言,因此,了解如何使用HTTP负载测试工具对PHP应用程序进行测试非常重要。HTTP负载测试工具可以帮助我们在不同的条件下模拟用户对应用程序的访问,以便我们了解我们的应用程序在不同的负载下的表现如何。在本文中,我...
    99+
    2023-10-01
    http load shell
  • 如何使用Postman和SoapUI工具测试WebService接口
    这篇文章主要讲解了“如何使用Postman和SoapUI工具测试WebService接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Postman和SoapUI工具测试WebSer...
    99+
    2023-06-30
  • Golang httptest包测试如何使用
    这篇“Golang httptest包测试如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang&nb...
    99+
    2023-07-05
  • Golang 函数测试的自动化工具
    testify/assert 是 go 语言中一种流行的函数测试自动化工具,通过安装和导入该工具,可以使用一系列断言函数来检查预期值与实际值是否相等,例如 equal(t, expect...
    99+
    2024-04-17
    测试自动化 golang git
  • Golang 函数测试的常用工具有哪些?
    在 go 中进行函数测试,可以使用:标准库中的 testing 包:提供基本断言函数。第三方工具,如:testify/assert:提供更丰富的断言方法。gomock:创建 mock 对...
    99+
    2024-04-16
    单元测试 集成测试 git golang 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作