作者 | 站长polaris       责编 | 欧阳姝黎

Go1.17 预计在 8 月份发布。目前 tip.golang.org 可以浏览 Go1.17 的相关内容,https://tip.golang.org/doc/go1.17 也有了 Go1.17 相关改动的部分文档。这段时间,我会陆续给大家分享 Go1.17 中相关的新特性,提前学习。好吧,提前卷了。

今天先聊聊在测试中增加的随机化 flag:shuffle。

安装 tip 版本

由于 Go1.17 还未发布,因此为了体验它的新特性,我们需要安装 tip 版本。这是一个正在开发的版本,也就是仓库的 master 分支代码。因此,我们需要通过源码编译安装。

这里我使用 goup 这个管理工具进行安装:

$ goup install tip

安装成功后,查看版本信息(你看到的大概率和我的不一样):

$ go version
go version devel go1.17-1607c28172 Sun May 30 02:37:38 2021 +0000 darwin/amd64

新的 shuffle flag

安装完 tip 版本后,执行如下命令:

$ go help testflag

然后找到下面这个 flag:

-shuffle off,on,NRandomize the execution order of tests and benchmarks.It is off by default. If -shuffle is set to on, then it will seedthe randomizer using the system clock. If -shuffle is set to aninteger N, then N will be used as the seed value. In both cases,the seed will be reported for reproducibility.

这是 Go1.17 新增的,提交的代码见:https://golang.org/cl/310033。

从名称可以看出,这是控制测试执行顺序是否随机的 flag。它有三个值:off、on 和 N,其中默认是 off,即不启用随机,这相当于 Go1.17 版本之前的测试行为。而 on 表示启用 shuffle,那 N 是什么意思?它也表示启用随机。on 和 N 的区别解释下:

因为是随机,就涉及到随机种子(seed)问题。当值是 on 时,随机数种子使用系统时钟;如果值是 N,则直接用这个 N 当做随机数种子。注意 N 是整数。

当测试失败时,如果启用了 shuffle,这个种子会打印出来,方便你重现之前测试场景。

例子体验下

创建一个包 calc,增加「加减乘除」四个函数:

func Add(x, y int) int {return x + y
}func Minus(x, y int) int {return x - y
}func Mul(x, y int) int {return x * y
}func Div(x, y int) int {return x / y
}

并为这四个函数写好单元测试(代码太长,这里只列出 Add 的,写法不重要,按你喜欢的方式写单元测试即可):

func TestAdd(t *testing.T) {type args struct {x inty int}tests := []struct {args argswant int}{{args{1, 2},3,},{args{-1, 3},3,  // 特意构造一个 failure 的 case},}for _, tt := range tests {if got := Add(tt.args.x, tt.args.y); got != tt.want {t.Errorf("Add() = %v, want %v", got, tt.want)}}
}

然后运行单元测试(不加 shuffle flag):

$ go test -v ./...
=== RUN   TestAddcalc_test.go:27: Add() = 2, want 3
--- FAIL: TestAdd (0.00s)
=== RUN   TestMinus
--- PASS: TestMinus (0.00s)
=== RUN   TestMul
--- PASS: TestMul (0.00s)
=== RUN   TestDiv
--- PASS: TestDiv (0.00s)
FAIL
FAIL test/shuffle 0.441s
FAIL

多次运行,发现执行顺序都是你文件中写好的单元测试顺序,我这里是 Add、Minus、Mul、Div。

加上 shuffle flag 后运行:

$ go test -v -shuffle=on ./...
-test.shuffle 1622383890431866000
=== RUN   TestMul
--- PASS: TestMul (0.00s)
=== RUN   TestDiv
--- PASS: TestDiv (0.00s)
=== RUN   TestAddcalc_test.go:27: Add() = 2, want 3
--- FAIL: TestAdd (0.00s)
=== RUN   TestMinus
--- PASS: TestMinus (0.00s)
FAIL
FAIL test/shuffle 0.177s
FAIL

输出有两处变化:

  • 多了 -test.shuffle 1622383890431866000,即上面说到的种子。如果不是 on 而是 N,则这里的值就是 N 的值;

  • 顺序不确定。你多次运行,发现每次顺序可能不一样;

顺便提一句,对于 benchmark,shuffle 这个 flag 也是适用的。

有什么用

有人可能会问,这个玩意有啥用?

确实,大部分时候这个特性没啥用。但如果你不希望测试之间有依赖关系,而担心实际上依赖了,可以加上这个 flag,以便发现潜在的问题。

其实,这个 flag 早在 2015 年 bradfitz 就提 issue 建议加上,原计划在 Go1.6 加上的,但没有人写提案,因此搁置了。6 年过去了,才加上该功能,可见需求不强烈。日常工作中,你大概率也不会用到,但知晓有这么个东西还是有用处的,万一需要时,可以用上。

本文出自《新程序员 001:开发者黄金十年》,生于2001年的《程序员》曾陪伴了无数开发者成长,影响了一代又一代的中国技术人。时隔20年,《新程序员》带着全球技术大师深邃思考、优秀开发者技术创造等深度内容回来了!同时将全方位为所有开发者呈现国内外核心技术生态体系全景图。扫描下方小程序码即可立即订阅!

Go1.17 这个新特性竟是 6 年前提出来的相关推荐

  1. oracle jdk1.7 内存,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...

  2. JDK 16 正式发布,一次性发布 17 个新特性,不服不行

    JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...

  3. JAVA17版本,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...

  4. Go1.20 arena新特性示例详解

    当时我们还想着 Go 团队应该不会接纳,至少不会那么快: 懒得翻也可以看我再次道来,本文提到的提案<proposal: arena: new package providing memory a ...

  5. Java基础学习总结(176)——JDK 16 正式发布,一次性发布 17 个新特性

    JDK 16 正式发布 JDK 16 不是一个长期支持的版本,只支持 6 个月到 2021 年 9 月,上一个长期支持版本还是 JDK 11,下一个长期支持版本是 JDK 17,还有半年也要发布了.所 ...

  6. C++11\14\17\20 新特性整理

    文章目录 C++11 新特性 01 auto 与 decltype 02 defaulted 与 deleted 函数 03 final 与 override 04 尾置返回类型 05 右值引⽤ 06 ...

  7. Go最新版下载 Go1.20版新特性

    Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动. 可以使用你任何喜欢的方式升级: 比如: go install golang.o ...

  8. Java基础学习总结(184)—— 从 Java 9 到 Java 17 的新特性解读

    一.Java 9 Java 9 最大的变化就是引入了一个 JShell 和模块化,日常并没有用太多,所以今天不花时间在这些功能上面. 新的创建集合的方法 用过谷歌 Guava 类库的知道,Guava  ...

  9. c++17新特性_每个开发者都应该了解的一些C++特性

    C++ 是一种强大的编程语言,但也因为其复杂性一直让用户望而却步.后来,C++ 决定做出改变,然后发展至今,成了编程社区最受欢迎的语言之一.C++ 有一些新特性非常好用,本文对此进行了介绍,比如 au ...

最新文章

  1. Sqli-labs less 50
  2. 录音降噪哪家强?搜狗西工大联合团队DNS挑战赛夺冠
  3. JAVA版连连看算法研究
  4. ARMV8/ARMV9的执行状态的切换
  5. 找不到托盘菜单配置文件_随手在仓库捡的木托盘,简单改造一下,10件家具不用买了...
  6. 进阶篇-安卓系统:5.安卓手机位置传感器
  7. 在WebLogic 12c上运行RichFaces
  8. 虚函数和纯虚函数的区别是什么?
  9. python list 实现原理,Python 列表(List)的底层实现原理分析
  10. 微软重新设计 Edge for Android 的用户界面
  11. mybatis 注解的方式批量插入,更新数据
  12. C语言实验报告排错分析,C语言实验报告模板剖析.doc
  13. 腾讯云服务器IP地址绑定域名步骤
  14. 移动脑电在神经发展障碍研究中的运用
  15. [css] 抖动效果
  16. 计算机网络知识点————交换机
  17. 推荐一款全能的跨平台文档格式转换工具 Pandoc
  18. php在线加密源代码,2019最新PHP在线云加密平台源码
  19. 微信分享,登陆支付等接口调用 白屏原因 记录一下
  20. python库——未完待续,紫薯布丁

热门文章

  1. LeetCode 169. 多数元素 (哈希映射|投票算法)
  2. leetcode875.KokoEatingBananas
  3. 如何通过反射创建对象
  4. 2-1 CPU多级缓存-缓存一致性.mkv
  5. Socket编程入门
  6. 程序发布出现: 服务器无法处理请求---无法生成临时类(result = 1)。 错误CS2001:未能找到源文件“C:\ Windows \ TEMP \ lph54vwf.0.cs”...
  7. 洛谷 P1028 数的计算【递推】
  8. 第一百九十八节,jQuery EasyUI,ProgressBar(进度条)组件
  9. EF6 MVC5译文
  10. Apache POI组件操作Excel,制作报表(四)