设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

查看: 5577|回复: 9

Go语言工程实践单元测试基准测试示例详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:25
  • 打卡月天数:0
  • 打卡总奖励:365
  • 最近打卡:2025-10-29 16:29:42
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
420
主题
394
精华
0
金钱
1615
积分
866
注册时间
2023-2-10
最后登录
2025-10-29

发表于 2023-3-1 19:58:49 | 显示全部楼层 |阅读模式
背景

测试的出现是为了避免项目中出现重大事故
测试是避免事故的最后一道屏障

测试

210010c0cgt6ng6ew2xent.jpeg

单元测试的覆盖率在一定程度上而言,决定了代码的质量

单元测试

210010snm89m7tmmdd311w.jpeg

通过测试单元的输出与期望值进行校对从而验证代码的正确性,从而保证新旧代码的互不影响与程序的正常运行。
进而单元测试较于编译更易于在较短的周期内发现和定位代码中的错误使损失最小化从而提升效率。所以写单元测试是很有必要的。
Golang单元测试对文件名和方法名,参数都有很严格的要求

  • 文件名必须以
    1. xx_test.go
    复制代码
    命名
  • 方法必须是
    1. Test[^a-z]
    复制代码
    开头
  • 方法参数必须
    1. t *testing.T
    复制代码
  • 初始化逻辑放到TestMain中
  • 使用
    1. go test
    复制代码
    执行单元测试

演示

通过第三方包assert演示单元测试
判断函数测试值与期望值是否一致
  1. import(
  2.     "github.com/stretchr/testify/assert"
  3.     "testing"
  4. )
  5. func TestHelloTom(t *testing.T) {
  6.     output := HelloTom()
  7.     expectOutput := "Tom"
  8.     assert.Equal(t, expectOutput, output)
  9. }
  10. func HelloTom() string {
  11.     return "Tom"
  12. }
复制代码
覆盖率

覆盖率出现的目的:

  • 衡量代码是否经过了足够的测试
  • 评价项目的测试水准
  • 评估项目是否达到了高水准测试等级
通过go test命令测试函数的覆盖率
  1. // judgment.go
  2. func JudgePassLine(score int16) bool {
  3.     if score >= 60 {
  4.         return true
  5.     }
  6.     else {
  7.         return false
  8.     }
  9. }
  10. // judgment_test.go
  11. func TestJudgePassLineTrue(t *testing.T) {
  12.     isPass := JudgeePassLine(70)
  13.     assert.Equal(t, true, isPass)
  14. }
  15. func TestJudgePassLineFalse(t *testing.T) {
  16.     isPass := JudgeePassLine(50)
  17.     assert.Equal(t, false, isPass)
  18. }
  19. /*
  20. 通过go test 命令测试覆盖率
  21. go test judgment_test.go judgment.go --cover
  22. */
复制代码
一般覆盖率:
  1. 50%~60%
复制代码
,较高覆盖率:
  1. 80%+
复制代码
测试分支相互独立、全面覆盖
对于上述案例代码而言
应出现成绩大于等于60 和小于60的测试用力
测试单元粒度足够小,函数单一职责

依赖

210013mbbu2nup6ug87gs8.jpeg


  • 幂等:重复运行同一个case,结果与之前一致
  • 稳定:指单元测试相互隔离,可以独立运行

文件处理

当测试文件被修改后,可能会导致测试失败或错误率增高
从而出现了Mock函数
  1. func ReadFirstLine() string {
  2.     open, err := os.Open("log") // 打开一个文件
  3.     defer open.Close()
  4.     if err != nil {
  5.         return ""
  6.     }
  7.     scanner := bufio.NewScanner(open) // 对每行进行遍历
  8.     for scanner.Scan() {
  9.         return scanner.Text()
  10.     }
  11.     return ""
  12. }
  13. func ProcessFirstLine() string {
  14.     line := ReadFirstLine()
  15.     destLine := strings.ReplaceAll(line, "11", "00") // 替换11为00
  16.     return destLine
  17. }
  18. func TestProcessFirstLine(t *testing.T) { // 执行单元测试
  19.     firstLine := ProcessFirstLine()
  20.     assert.Equal(t, "line00", firstLine)
  21. }
复制代码
Mock

monkey: github.com/bouk/monkey 这是一个开源的mock测试库,可以对method或者实例的方法进行mock
Monkey Patch的作用域在Runtime, 运行时通过Go的unsafe包能够将内存中函数的地址替换为运行时函数的地址,将待打桩函数或方法的实现跳转。
Mock函数不仅可以为一个函数打桩 也可以为一个方法打桩
  1. // 用函数A去替换函数B,B就是原函数,A就是打桩函数
  2. func Patch(target, replacement interface{}) *PatchGuard {
  3.     // target就是原函数,replacement就是打桩函数
  4.     t := reflect.ValueOf(target)
  5.     r := reflect.ValueOf(replacement)
  6.     patchValue(t, r)
  7.     return &PatchGuard{t, r}
  8. }
  9. func Unpatch(target interface{}) bool {
  10.     // 保证了在测试结束之后需要把这个包卸载掉
  11.     return unpatchValue(reflect.ValueOf(target))
  12. }
  13. func TestProcessFirstLineWithMock(t *testing.T) {
  14.     monkey.Patch(ReadFirstLine, func() string {
  15.         return "line110"
  16.     })
  17.     defer monkey.Unpatch(ReadFirstLine)
  18.     line := ProcessFirstLine()
  19.     assert.Equal(t, "line000", line)
  20. }
  21. // 通过patch对ReadFirstLine进行打桩mock,默认返回line110,通过defer卸载mock
  22. // 这样整个测试函数就摆脱了本地文件的束缚和依赖
复制代码
基准测试

基准测试是指测试一段程序的性能及耗费CPU的程度;
在实际的项目开发中,经常会遇到代码性能瓶颈,为了定位问题,经常要对代码做性能分;
这时就用到了基准测试,其使用方法与单元测试类似。

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力

小结

对于今日课程而言,我将其划分成测试的重要性与分类。 当前课程余下部分为项目实战,该部分内容选择了放置于项目笔记。 如果笔记中有错误的地方也希望掘友们可以及时的提出纠正,更多关于Go语言单元测试基准测的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2023-3-2 11:32:15 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:1
  • 打卡总奖励:302
  • 最近打卡:2025-12-13 20:40:00
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
355
积分
62
注册时间
2023-3-14
最后登录
2025-12-13

发表于 2023-5-22 19:49:23 | 显示全部楼层
感谢分享~~~~学习学习~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-5-2
最后登录
2023-5-2

发表于 2023-8-27 23:56:25 | 显示全部楼层
看看,学习学习~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2023-9-1 18:05:18 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2023-9-27 18:57:00 | 显示全部楼层
感谢大大分享~~~~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2023-10-25 09:21:25 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2023-10-30 13:58:57 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2023-12-8 22:46:37 | 显示全部楼层
感谢楼主分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2024-1-15 10:11:38 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼
7楼
8楼
9楼
10楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表