大家好,我是polarisxu。Go1.17预计8月份发布。目前tip.golang.org可以浏览到Go1.17的相关内容,https://tip.golang.org/doc/go1.17也有一些Go1.17的变化相关的文档。这段时间给大家分享Go1.17的相关新特性,提前学习。..嗯,早点roll~说说今天测试中加入的随机标志:shuffle。01安装tip版本由于Go1.17还没有发布,为了体验它的新特性,我们需要安装tip版本。这是一个正在开发中的版本,是版本库的master分支代码。因此,我们需要从源码编译安装。这里我使用goup管理工具安装:$goupinstalltip安装成功后查看版本信息(你看到的可能和我的不一样):$goversiongoversiondevelgo1.17-1607c28172SunMay3002:37:382021+0000darwin/amd6402newshuffleflag安装完tip版本后,执行如下命令:$gohelptestflag然后找到下面这个flag:-shuffleoff,on,NRandomizetheexecutionorderoftestsandbenchmarks.Itisoffbydefault.If-shuffleissettoon,thenitwillseedtherandomizerusingthesystemclock.If-shuffleissettoanintegerN,thenNwillbeusedastheseedvalue.Inbothcases,theseedwillbereportedforreproducibility.这是Go1.17新已添加,见提交代码:https://golang.org/cl/310033。从名字就可以看出,这是一个控制测试执行顺序是否随机的标志。它有off、on、N三个值,其中默认为off,即不开启随机化,相当于Go1.17之前的测试行为。在启用随机播放的方法上,N是什么意思?这也意味着启用随机。on和N的区别解释:因为是随机的,所以涉及到随机种子(seed)问题。值为on时,随机数种子使用系统时钟;如果值为N,直接用这个N作为随机数种子。请注意,N是一个整数。当测试失败时,如果开启了shuffle,这个seed会被打印出来,这样就可以重现之前的测试场景。03实例体验下创建一个包calc,添加“加减乘除”四个函数:funcAdd(x,yint)int{returnx+y}funcMinus(x,yint)int{returnx-y}funcMul(x,yint)int{returnx*y}funcDiv(x,yint)int{returnx/y}并为这四个函数写单元测试(代码太长,这里只列出Add,写法不是重要的是,按照你喜欢的方式编写单元只是为了测试):funcTestAdd(t*testing.T){typeargsstruct{xintyint}tests:=[]struct{argsargswantint}{{args{1,2},3,},{args{-1,3},3,//故意构造一个失败案例},}for_,tt:=rangetests{ifgot:=Add(tt.args.x,tt.args.y);got!=tt.want{t.Errorf("Add()=%v,want%v",got,tt.want)}}}然后运行单元测试(没有shuffle标志):$gotest-v./...===RUNTestAddcalc_test.go:27:Add()=2,want3---FAIL:TestAdd(0.00s)===RUNTestMinus---PASS:TestMinus(0.00s)===RUNTestMul---PASS:TestMul(0.00s)===RUNTestDiv---PASS:TestDiv(0.00s)FAILFAILtest/shuffle0.441sFAIL已经运行多次s,发现执行顺序就是你文件中写的单元测试顺序。在这里,我是Add、Minus、Mul、Div。添加shuffle标志后运行:$gotest-v-shuffle=on./...-test.shuffle1622383890431866000===RUNTestMul---PASS:TestMul(0.00s)===RUNTestDiv---PASS:TestDiv(0.00s))===RUNTestAddcalc_test.go:27:Add()=2,want3---FAIL:TestAdd(0.00s)===RUNTestMinus---PASS:TestMinus(0.00s)FAILFAILtest/shuffle0.177sFAIL输出有两个变化:more-test.shuffle1622383890431866000,就是上面说的种子。如果不是on而是N,这里的值就是N的值;订单未定义。你多次运行,发现每次的顺序可能都不一样;顺便说一下,对于基准测试,flagshuffle也适用。04有什么用有人会问,这东西有什么用?事实上,大多数时候这个功能是没有用的。但是如果你不想在测试之间有依赖关系,但担心实际依赖它们,你可以添加这个标志来发现潜在的问题。其实bradfitz早在2015年就提出要添加这个flag,本来打算在Go1.6中添加,但是没有人写提案,所以搁置了。6年后才加入这个功能,可见需求并不强烈。您可能不会在日常工作中使用它,但知道有这样一个东西还是很有用的,您可以在需要时使用它。本文转载自微信公众号「polarisxu」,可通过以下二维码关注。转载本文请联系polarisxu公众号。
