Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

24 | 测试的基本规则和流程(下)

t.Fatalf
t.Fatal
t.Errorf
t.Error
t.Logf
t.Log
t.FailNow
测试日志
GODEBUG环境变量
缓存
失败
成功
复杂测试结果
testing包API
go test命令标记
平均耗时
执行次数
b.N
-cpu
-run
-bench
测试结果
主要流程
基本规则
高级内容
解读测试结果
测试流程
Benchmark函数
go test命令标记
go test命令
程序测试的重要性
思考题
总结
性能测试
Go语言
测试的基本规则和流程

该思维导图由 AI 生成,仅供参考

你好,我是郝林。今天我分享的主题是测试的基本规则和流程的(下)篇。
Go 语言是一门很重视程序测试的编程语言,所以在上一篇中,我与你再三强调了程序测试的重要性,同时,也介绍了关于go test命令的基本规则和主要流程的内容。今天我们继续分享测试的基本规则和流程。本篇代码和指令较多,你可以点击文章查看原文。

知识扩展

问题 1:怎样解释功能测试的测试结果?

我们先来看下面的测试命令和结果:
$ go test puzzlers/article20/q2
ok puzzlers/article20/q2 0.008s
$符号开头表明此行展现的是我输入的命令。在这里,我输入了go test puzzlers/article20/q2,这表示我想对导入路径为puzzlers/article20/q2的代码包进行测试。代码下面一行就是此次测试的简要结果。
这个简要结果有三块内容。最左边的ok表示此次测试成功,也就是说没有发现测试结果不如预期的情况。
当然了,这里全由我们编写的测试代码决定,我们总是认定测试代码本身没有 Bug,并且忠诚地落实了我们的测试意图。在测试结果的中间,显示的是被测代码包的导入路径。
而在最右边,展现的是此次对该代码包的测试所耗费的时间,这里显示的0.008s,即 8 毫秒。不过,当我们紧接着第二次运行这个命令的时候,输出的测试结果会略有不同,如下所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Go语言中程序测试的重要性以及`go test`命令的基本规则和主要流程。作者详细解释了功能测试和性能测试的测试结果及其解读方法,包括测试成功和测试失败的情况。对于性能测试,文章重点讨论了`go test`命令的标记`-bench`和`-run`的使用,以及性能测试结果中的各项指标的含义和解读方式。此外,还介绍了如何在测试函数中指定预期的打印内容。总的来说,本文通过具体的测试命令和结果,帮助读者了解了功能测试和性能测试的测试结果及其解读方法,为读者提供了实用的测试规则和流程知识。文章内容深入浅出,适合读者快速了解Go语言程序测试的基本规则和流程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • HF
    老师,go如何写出可测试的代码,有什么规范吗?

    作者回复: 网上有不少相关的文章。我说3点基本的吧: 1. 隐藏不该暴露的。测试代码相当于使用你程序的一方,不要让它能够影响甚至破坏你的程序。 2. 暴露出来的API应该对使用者友好。换句话会所,如果在写测试代码的时候,你发现API调用起来不那么顺畅,那么就需要考虑程序的API是否得当了。 3. 保持API在风格上的一致性。风格一致的程序有助于使用方快速运用和理解程序。 这3点是基本的原则了,其他的细节上的东西说到底都是为了做到这3点的。测试代码就是对生产代码的前期验证。

    2020-05-10
    18
  • willmeng
    请问,如何修改默认测试时间上限呢?

    作者回复: 我不太清楚你说的“默认测试时间”是指什么。 如果是性能测试的话,可以在执行 go test 命令时追加 -benchtime 标记。这实际上是下一篇文章的思考题。 另外,-timeout 标记可用于设定当次测试运行的总时长,一旦超过这个时长就panic。 具体用法可以参考:https://golang.org/cmd/go/#hdr-Testing_flags 。

    2019-04-14
    7
  • 象牙塔下的渣渣
    老师,能不能把每节课后面的思考题给出答案啊?另外,你这个专栏上的内容在您的那本《Go并发编程》上有嘛?

    作者回复: 这个专栏是完全重写的,几乎跟书上的东西没有重叠。答案的话我赶完稿子后面再补吧。现在补精力跟不上。

    2018-10-11
    6
  • 给力
    有个疑问: go test 的相关参数 可以用go help test去看。 但是这里面并没有其他参数比如(-cpu 是最大用几核 -bench 是基准测试参数 -run功能测试参数),有没有help命令找出对应每个参数的含义,我用的时候只需要help一下就能找到对应的参数使用。

    作者回复: 你敲 go help test 并回车之后会发现最后有两段话: The test binary also accepts flags that control execution of the test; these flags are also accessible by 'go test'. See 'go help testflag' for details. For more about build flags, see 'go help build'. For more about specifying packages, see 'go help packages'. 第一段的意思是,一些更详细的参数说明需要敲 go help testflag 查看。第二段的意思是,go test 也支持 go build 的一些参数,那些参数需要敲 go help build 查看,另外怎么指定代码包需要敲 go help packages 查看说明。

    2020-03-24
    2
    5
  • 左氧佛沙星人
    我用编辑器运行的时候,报错: # command-line-arguments [command-line-arguments.test] ./demo52_test.go:10:19: undefined: hello ./demo52_test.go:20:18: undefined: hello ./demo52_test.go:38:11: undefined: introduce 老师能帮忙解答一下吗?

    作者回复: 初学的时候最好用命令行运行。 两种解决方案: 1. 在当前代码包下运行 go test 命令。这样可以执行当前代码包下的所有功能测试函数。 2. 在当前代码包下运行 go test demo52_test.go demo52.go 命令。这样只会执行 demo52_test.go 文件中的功能测试函数。

    2019-04-13
    3
    4
  • 疯琴
    结果讲解很清楚👍 cpu那里还不明白,我的笔记本2核超线程,显示-4,我设置-cpu参数为20、100、1000都能跑,也更快,可是这有什么意义呢?通常是不是不设置这个参数就好?

    作者回复: 肯定是都能跑的。这个参数主要是为了模拟多核CPU执行程序。这样可以测试并发程序在各种计算环境中的执行情况,包括功能正确性和性能。

    2020-01-15
    3
  • 海盗船长
    go1.12.5 使用go test,多次测试相同的成功测试代码,并没有cached

    作者回复: 我的测试结果如下: q2 git:(master) ✗ go test puzzlers/article20/q2 ok puzzlers/article20/q2 1.369s ➜ q2 git:(master) ✗ go test puzzlers/article20/q2 ok puzzlers/article20/q2 (cached) ➜ q2 git:(master) ✗ go test puzzlers/article20/q2 ok puzzlers/article20/q2 (cached)

    2020-01-15
    2
  • jxs1211
    修改b.N的值是由go运行时控制的吗,并不需要我们关注吧

    作者回复: 设置b.N是为了多次(N次)执行同一个被测函数,以便获得它的性能量化指标。一般情况下,你可以不去手动设置,但是应该知道它是做什么的。

    2021-12-19
  • moonfox
    问题:是否测试总时间一定会超过1秒? 答: 因为要找到1秒内最大可执行次数,而在这之前肯定要进行多次尝试,所以测试总时间应该总是会超过1秒的。 不知道这样理解是否正确呀

    作者回复: 当你用 b.N 做循环的时候,这个时间一般都会大于 1 秒的。但注意,这是对于单个测试函数而言的,不是测试总时间。

    2021-07-09
  • moonfox
    “最后再看这个执行次数的右边,2314 ns/op表明单次执行GetPrimes函数的平均耗时为2314纳秒。这其实就是通过将最后一次执行测试函数时的执行时间,除以(被测函数的)执行次数而得出的。” 根据文章所说, 500000是最后一次运行时的执行的次数,那可以倒推最后一次的运行时间 为 (2314 * 500000.0 ) / 1000 ^ 3 = 1.157秒,这个时间已经超过了默认时间上限1秒,与文章中说执行的次数是取最后一次不超过1秒的执行次数 相矛盾,对这点不是很理解

    作者回复: 文中还有一句话:“当某次执行的时间大于或等于上限时,我们就说这是命令此次对该测试函数的最后一次执行。”

    2021-07-09
    2
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部