广告位联系
返回顶部
分享到

golang testing使用示例介绍

Golang 来源:互联网 作者:佚名 发布时间:2024-05-14 21:36:59 人浏览
摘要

testing包服务于自动化测试 基本测试 Table Drvien Test 基于表的测试通过表形式进行测试每种情况的输入和期望输出,从而测试程序的正确性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 func TestFib(t *te

testing包服务于自动化测试

基本测试

Table Drvien Test

基于表的测试通过表形式进行测试每种情况的输入和期望输出,从而测试程序的正确性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

func TestFib(t *testing.T) {

    var fibTests = []struct {

        in       int // input

        expected int // expected result

    }{

        {1, 1},

        {2, 1},

        {3, 2},

        {4, 3},

        {5, 5},

        {6, 8},

        {7, 13},

    }

    for _, tt := range fibTests {

        actual := Fib(tt.in)

        if actual != tt.expected {

            t.Errorf("Fib(%d) = %d; expected %d", tt.in, actual, tt.expected)

        }

    }

}

  • 跳过测试
    • SkipNow(): 跳过测试
    • Skip(): 跳过测试并输出log
    • Skipf(): 跳过测试并格式化输出log
  • 失败但继续
    • Fail(): 标记测试失败,但继续执行
    • FailNow(): 标记测试失败,不继续执行
    • Error(): 标记测试失败,并输出
    • Errorf(): 标记测试失败,并格式化输出
  • 输出
    • Log(): 输出
    • Logf(): 格式化输出
  • 失败且中断
    • Fatal(): 相当于FailNow() + Log()
    • Fatalf(): 相当于FailNow() + Logf()

Parallel()

Parallel方法表示会和其他带有Parallel方法的测试并行执行

ExampleXXX()

ExampleXXX方法中如果含有Output: 开头的行注释,则会在运行测试期间,将输出和注释中的值相比较

如果是不确定的顺序,则可以以Unordered output: 作为开头

但如果没有这样的注释,这就是一个普通函数,不能被直接运行

压力测试

压力测试方法以func BenchmarkXXX(*testing.B)函数名展现。

函数体格式如下

1

2

3

4

5

func BenchmarkHello(b *testing.B) {

    for i := 0; i < b.N; i++ {

        // do sth

    }

}

压力测试会自动调整b.N使得持续足够长时间

重置计时器

如果想要跳过不需要计时的耗时工作,那么可以通过b.ResetTimer()重置计时器

并行测试

如果想并行压力测试,那么可以通过RunParallel实现

1

2

3

4

5

func BenchmarkHelloParallel(b *testing.B) {

  b.RunParallel(func(pb *testing.PB) {

    // do sth

  })

}

内存统计

ReportAllocs方法用于打开内存统计功能

输出结果就会变成如下形式

// 方法名        迭代总次数        平均每次迭代时间        平均每次迭代分配字节数        平均每次迭代的内存分配次数
BenchmarkHello        2000000           898 ns/op         368 B/op           9 allocs/op

自定义度量值

ReportMetric(n float64, unit string)汇报自定义度量值

  • 如果度量值是每次迭代的,你应该将其除以 b.N。
  • 按照惯例,单位应该以 “/op” 结尾。
  • ReportMetric 会覆盖同一单位的任何先前报告的值。如果单位是空字符串,或者单位包含任何空格,ReportMetric 会引发 panic。
  • 如果单位是基准测试框架本身通常报告的单位(如 “allocs/op”),ReportMetric 会覆盖该度量值。
  • 将 “ns/op” 设置为 0 将禁止该内置度量值。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

testing.Benchmark(func(b *testing.B) {

        var compares int64

        for i := 0; i < b.N; i++ {

            s := []int{5, 4, 3, 2, 1}

            sort.Slice(s, func(i, j int) bool {

                compares++

                return s[i] < s[j]

            })

        }

        // This metric is per-operation, so divide by b.N and

        // report it as a "/op" unit.

        b.ReportMetric(float64(compares)/float64(b.N), "compares/op")

        // This metric is per-time, so divide by b.Elapsed and

        // report it as a "/ns" unit.

        b.ReportMetric(float64(compares)/float64(b.Elapsed().Nanoseconds()), "compares/ns")

    })

子测试

子测试也就是可以在测试中测试,子测试可以共用初始化等公共操作,并可以做父测试执行前的必要操作

1

2

3

4

5

6

7

8

9

10

11

func TestSubTest(t *testing.T) {

    t.Run("sub1", func(t *testing.T) {

        t.Log("sub1")

    })

    t.Run("sub2", func(t *testing.T) {

        t.Log("sub2")

    })

    t.Run("sub3", func(t *testing.T) {

        t.Log("sub3")

    })

}

模糊测试

模糊测试方法名为func FuzzXXX(f *testing.F)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

func FuzzReverse(f *testing.F) {

    // 为模糊测试添加用例到种子语料库

    testcases := []string{"Hello, world", " ", "!12345"}

    for _, tc := range testcases {

        f.Add(tc)  // Use f.Add to provide a seed corpus

    }

    // 进行模糊测试。对于string类型的参数,将生成随机字符串

    // 对于本测试中的Reverse方法是可逆的,因此可以通过两次逆行操作来验证其正确性

    f.Fuzz(func(t *testing.T, orig string) {

        rev := Reverse(orig)

        doubleRev := Reverse(rev)

        if orig != doubleRev {

            t.Errorf("Before: %q, after: %q", orig, doubleRev)

        }

        if utf8.ValidString(orig) && !utf8.ValidString(rev) {

            t.Errorf("Reverse produced invalid UTF-8 string %q", rev)

        }

    })

}

运行模糊测试有go test和go test -fuzz两种方式,前者仅会运行手动添加的用例,而后者则会随机生成数据

值得注意的是如果go test -fuzz执行之后存在运行错误的用例会添加到语料库文件中,那么即使下次执行的是go test也依然会执行语料库文件中的用例

Ref

https://go.dev/doc/tutorial/fuzz

https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter09/09.0.html


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Go实现数据脱敏的方案设计
    在一些常见的业务场景中可能涉及到用户的手机号,银行卡号等敏感数据,对于这部分的数据经常需要进行数据脱敏处理,就是将此部分数
  • golang testing使用示例介绍
    testing包服务于自动化测试 基本测试 Table Drvien Test 基于表的测试通过表形式进行测试每种情况的输入和期望输出,从而测试程序的正确性
  • Golang流程控制语句的具体使用

    Golang流程控制语句的具体使用
    顺序控制 顺序控制 默认情况下,Go代码执行顺序是按照从上到下依次执行的,这种按照顺序执行的代码就叫做顺序语句。如下: 1 2 3 4 5 6
  • Golang图片验证码的使用方法介绍

    Golang图片验证码的使用方法介绍
    一、背景 最近在使用到Golang进行原生开发,注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现,发现了这个库用得还
  • Golang中实现类似类与继承的方法
    在Go语言中,并没有像传统面向对象编程语言(Java、C++)中那样的类和继承的概念。Go语言采用了结构体和组合的方式来实现类似的功能。
  • Golang中四种gRPC模式举例介绍
    1. Unary RPC proto文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 syntax = proto3; option go_package=.;service; message HelloRequest { // Name of the person to greet string n
  • go-python库使用应用介绍
    在当今软件开发领域,跨语言编程已经成为一种常见的需求。不同的编程语言各自有其优势和适用场景,因此在项目开发过程中,经常需要
  • Go json反序列化“null“的问题解决

    Go json反序列化“null“的问题解决
    有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map
  • 在golang中将“2023年4月”解析为time.Time对象的详细
    我无法将像April 2023这样的日期字符串解析为 time.Time 对象来比较 golang 中的日期时间对象。 正确答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main
  • 在golang中,我可以使用flag包来定义一个可以选择
    我想做的是能够运行这三个场景: cmd --test --branchrelease cmd --测试全部 --branch release cmd --分支发布 能够在没有参数(如布尔值)的情况下自行
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计