我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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单元测试中的技巧是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

    下载Word文档

    猜你喜欢

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

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

    Golang单元测试中的技巧分享

    这篇文章主要为大家详细介绍了Golang进行单元测试时的一些技巧和科技,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-13

    Go 函数单元测试中的模拟技巧

    单元测试中的模拟是在单元测试中创建测试替身以替换外部依赖项的技术,允许隔离和测试特定函数。基本原则是:定义接口、创建模拟、注入模拟。使用 googlemock 模拟,需要定义接口、创建模拟、在测试函数中注入它。使用 testify/mock
    Go 函数单元测试中的模拟技巧
    2024-04-30

    Go 函数单元测试的重构技巧

    为了提高 go 函数单元测试的可维护性和可读性,我们可以:提取断言函数简化代码。采用表驱动的测试组织测试数据。编写 mocking 接口测试函数与组件的交互。运行细粒度的测试隔离和调试问题。应用覆盖率工具确保测试全面性和指导改进。Go 函数
    Go 函数单元测试的重构技巧
    2024-05-04

    Golang 函数测试中的集成测试技巧

    在 go 语言中,集成测试用于模拟外部依赖项以测试函数。利用 ginkgo 和 gomega,可以执行以下集成测试:测试外部 api 调用,模拟 http.get 函数并验证响应。测试数据库交互,模拟数据库连接并验证插入数据后的结果。Go
    Golang 函数测试中的集成测试技巧
    2024-04-16

    C++ 函数单元测试中性能优化技巧?

    通过采用以下技巧,可以提升 c++++ 函数单元测试的性能:禁用不必要的输出,减少测试框架的打印信息开销。缓存耗时的运算,避免重复计算。使用线程池并行执行测试,提升测试速度。优化后的单元测试执行速度更快、稳定性更高,可用于对复杂函数和更大数
    C++ 函数单元测试中性能优化技巧?
    2024-04-25

    PHP 函数中的单元测试技巧和最佳实践

    php 函数单元测试技巧和最佳实践包括:为每个函数编写单独的测试用例。使用断言验证预期结果。覆盖不同输入场景。模拟外部依赖项。使用桩函数/模拟对象进行隔离测试。PHP 函数中的单元测试技巧和最佳实践单元测试是任何软件开发生命周期中不可或缺
    PHP 函数中的单元测试技巧和最佳实践
    2024-05-01

    如何在 Golang 单元测试中调试失败的测试?

    如何调试 golang 单元测试失败?查看错误消息,以了解失败原因。使用 delve 调试器逐步执行测试,检查变量值和代码流程。添加日志语句,以跟踪测试执行并获取更多信息。如何在 Golang 单元测试中调试失败的测试在编写 Golang
    如何在 Golang 单元测试中调试失败的测试?
    2024-05-16

    Python单元测试的作用是什么

    本篇内容主要讲解“Python单元测试的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python单元测试的作用是什么”吧!说明1、单元测试确保程序模块的行为符合我们设计的测试用例。将
    2023-06-20

    C#单元测试概念是什么

    本篇内容主要讲解“C#单元测试概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#单元测试概念是什么”吧!C#单元测试应用的环境:通常而言,一个单元测试是用于判断某个特定条件(或者场景)
    2023-06-17

    单元测试与集成测试在golang函数测试中的区别?

    单元测试和集成测试是两种不同的 go 函数测试类型,分别用于验证单个函数或多个函数的交互和集成。单元测试只测试特定函数的基本功能,集成测试测试多个函数之间的交互和与应用程序其他部分的集成。单元测试与集成测试在 Go 函数测试中的区别在 G
    单元测试与集成测试在golang函数测试中的区别?
    2024-04-27

    Golang 函数调试和单元测试有什么区别?

    函数调试和单元测试在 golang 中是不同的概念,分别用于查找运行时错误(函数调试)和验证代码正确性(单元测试)。Golang 函数调试和单元测试的区别简介Golang 中,函数调试和单元测试是两个不同的概念。函数调试用于在代码运行时
    Golang 函数调试和单元测试有什么区别?
    2024-04-17

    PHP 单元测试:增加代码覆盖率的技巧

    php 单元测试中提高代码覆盖率的方法:使用 phpunit 的 --coverage-html 选项生成覆盖率报告。使用 setaccessible 方法覆盖私有方法和属性。使用断言覆盖布尔条件。利用代码审查工具获得额外的代码覆盖率洞察。
    PHP 单元测试:增加代码覆盖率的技巧
    2024-05-22

    单元测试 Go 函数时的性能优化技巧

    针对 go 函数的单元测试性能优化技巧:使用 benchmark 套件: 对特定场景的函数性能进行评估。并行运行测试: 对于独立测试,并行运行可显着提高性能。使用 goconvey 或 ginkgo: 这些框架自动并行测试,简化测试编写。使
    单元测试 Go 函数时的性能优化技巧
    2024-05-01

    Golang实现单元测试中的逻辑层

    前面我们完成了最麻烦的数据层的单元测试,今天我们来看看单元测试中最容易做的一层,数据逻辑层,也就是我们通常说的service或者biz等
    2023-03-10

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录