iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang单元测试中的技巧是什么
  • 820
分享到

Golang单元测试中的技巧是什么

2023-07-05 12:07:05 820人浏览 薄情痞子
摘要

这篇文章主要讲解了“golang单元测试中的技巧是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang单元测试中的技巧是什么”吧!打桩测试当我们在编写单元测试的时候,有时我们非常想

这篇文章主要讲解了“golang单元测试中的技巧是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang单元测试中的技巧是什么”吧!

    打桩测试

    当我们在编写单元测试的时候,有时我们非常想 mock 掉其中一个方法,但是这个方法又没有接口去定义和实现(无法用 GitHub.com/golang/mock 来实现),这时就可以尝试看看我们的打桩黑科技。

    代码

    这里我们使用 github.com/agiledragon/gomonkey 来实现。

    实际中,经常在代码中会遇到一些随机值的情况,比如验证码。为了方便测试,我们会想要 mock 掉随机值方法,让每次产生的值固定方便后续的测试。

    package mainimport (  "fmt"  "testing"  "github.com/agiledragon/gomonkey/v2"  "go-demo/m/unit-test/other/rand")func init() {  gomonkey.ApplyFunc(rand.Number, func() int { return 666 })}func TestRand(t *testing.T) {  fmt.Println(rand.Number())}

    其中 rand.Number() 是我们在另一个包中实现的方法。我们使用 gomonkey.ApplyFunc 相当于直接替换了原有方法的实现,强制返回了 mock 的数据 666。

    注意事项

    • 使用 gomonkey 时,注意一定要使用 -GCflags=all=-l 来禁止内联优化,否则容易导致打桩不生效。如:go test -gcflags=all=-l -v

    • Mac 的 M1 下打桩不生效,可以使用环境变量 GOARCH=amd64 来进行测试,只不过这样就无法进行断点调试。https://github.com/agiledragon/gomonkey/issues/77

    • 毕竟是黑科技,实际使用环境对于测试还是有影响的。

    压测

    这里的压测通常不是对接口的压测,而是对于某些方法的压测。Golang 提供 非常好用的 b *testing.B 来专门进行压测。

    代码

    非常容易上手,让我们直接来看代码

    var numbers = []int{  100,  1000,  77777,  666666,}func BenchmarkPrimeNumbers(b *testing.B) {  for _, v := range numbers {    b.Run(fmt.Sprintf("calc_num_%d", v), func(b *testing.B) {      for i := 0; i < b.N; i++ {        primeNumbers(v)      }    })  }}

    使用

    使用 -bench=. 即可

    ➜ go test -bench=. b_test.go
    goos: darwin
    goarch: arm64
    BenchmarkPrimeNumbers/calc_num_100-8             3391329               348.9 ns/op
    BenchmarkPrimeNumbers/calc_num_1000-8             293733              3979 ns/op
    BenchmarkPrimeNumbers/calc_num_77777-8               730           1619089 ns/op
    BenchmarkPrimeNumbers/calc_num_666666-8               42          28509805 ns/op
    PASS
    ok      command-line-arguments  5.846s

    可以看到次数和耗时,这样的数据经常会被贴在开源项目README的性能比较板块中。

    测试覆盖率

    单元测试当然少不了覆盖率咯,看着高高的覆盖率才有成就感对不对?

    我们可以使用 -cover 参数来统计单元测试的代码覆盖率

    ➜ go test -cover .           
    ok      go-demo/m/unit-test/service     0.879s  coverage: 70.0% of statements

    还可以生成 profile 然后通过可视化网页查看分析

    ➜ go test ./... -coverprofile=cover.out
    ok      go-demo/m/unit-test/service     0.108s  coverage: 70.0% of statements
    ➜ go tool cover -html=cover.out

    当然,如果你和我一样使用 goland 进行开发,可以直接在界面上点击单元测试,就可以快速进行覆盖率测试,并且展示也很方便,很快能看到有哪些代码没有被测试覆盖。

    Golang单元测试中的技巧是什么

    Golang单元测试中的技巧是什么

    表格驱动测试

    TDT 的提出也算是给单元测试提供了一条不错的思路。主要的形式就是将测试的数据做成类似表格,然后测试的时候遍历所有的数据来进行测试,测试代码不动,只需要增加测试数据就可以了。go 很多官方库用了这样的写法来做测试。

    package mainimport (    "testing")func TestAdd(t *testing.T) {    tests := []struct {        a, b, expected int    }{        {1, 2, 3},        {0, 0, 0},        {-1, 1, 0},        {-1, -1, -2},    }    for _, test := range tests {        result := Add(test.a, test.b)        if result != test.expected {            t.Errorf("Add(%d, %d) = %d; expected %d", test.a, test.b, result, test.expected)        }    }}func Add(a, b int) int {    return a + b}

    我们可以通过 github.com/cweill/gotests 来帮助我们快速生成想要的表格驱动测试代码

    感谢各位的阅读,以上就是“Golang单元测试中的技巧是什么”的内容了,经过本文的学习后,相信大家对Golang单元测试中的技巧是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    您可能感兴趣的文档:

    --结束END--

    本文标题: Golang单元测试中的技巧是什么

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作