成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.17這個新特性竟然是6年前提出來的

開發 后端
Go1.17 預計在 8 月份發布。目前 tip.golang.org 可以瀏覽 Go1.17 的相關內容,https://tip.golang.org/doc/go1.17 也有了 Go1.17 相關改動的部分文檔。這段時間,我會陸續給大家分享 Go1.17 中相關的新特性,提前學習。。。好吧,提前卷了~

[[402459]]

大家好,我是 polarisxu。

Go1.17 預計在 8 月份發布。目前 tip.golang.org 可以瀏覽 Go1.17 的相關內容,https://tip.golang.org/doc/go1.17 也有了 Go1.17 相關改動的部分文檔。這段時間,我會陸續給大家分享 Go1.17 中相關的新特性,提前學習。。。好吧,提前卷了~

今天先聊聊在測試中增加的隨機化 flag:shuffle。

01 安裝 tip 版本

由于 Go1.17 還未發布,因此為了體驗它的新特性,我們需要安裝 tip 版本。這是一個正在開發的版本,也就是倉庫的 master 分支代碼。因此,我們需要通過源碼編譯安裝。

這里我使用 goup 這個管理工具進行安裝:

  1. $ goup install tip 

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

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

02 新的 shuffle flag

安裝完 tip 版本后,執行如下命令:

  1. $ go help testflag 

然后找到下面這個 flag:

  1. -shuffle off,on,N 
  2.         Randomize the execution order of tests and benchmarks. 
  3.         It is off by default. If -shuffle is set to onthen it will seed 
  4.         the randomizer using the system clock. If -shuffle is set to an 
  5.         integer N, then N will be used as the seed value. In both cases, 
  6.         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,這個種子會打印出來,方便你重現之前測試場景。

03 例子體驗下

創建一個包 calc,增加「加減乘除」四個函數:

  1. func Add(x, y intint { 
  2.  return x + y 
  3.  
  4. func Minus(x, y intint { 
  5.  return x - y 
  6.  
  7. func Mul(x, y intint { 
  8.  return x * y 
  9.  
  10. func Div(x, y intint { 
  11.  return x / y 

并為這四個函數寫好單元測試(代碼太長,這里只列出 Add 的,寫法不重要,按你喜歡的方式寫單元測試即可):

  1. func TestAdd(t *testing.T) { 
  2.  type args struct { 
  3.   x int 
  4.   y int 
  5.  } 
  6.  tests := []struct { 
  7.   args args 
  8.   want int 
  9.  }{ 
  10.   { 
  11.    args{1, 2}, 
  12.    3, 
  13.   }, 
  14.   { 
  15.    args{-1, 3}, 
  16.    3,  // 特意構造一個 failure 的 case 
  17.   }, 
  18.  } 
  19.  for _, tt := range tests { 
  20.   if got := Add(tt.args.x, tt.args.y); got != tt.want { 
  21.    t.Errorf("Add() = %v, want %v", got, tt.want) 
  22.   } 
  23.  } 

然后運行單元測試(不加 shuffle flag):

  1. $ go test -v ./... 
  2. === RUN   TestAdd 
  3.     calc_test.go:27: Add() = 2, want 3 
  4. --- FAIL: TestAdd (0.00s) 
  5. === RUN   TestMinus 
  6. --- PASS: TestMinus (0.00s) 
  7. === RUN   TestMul 
  8. --- PASS: TestMul (0.00s) 
  9. === RUN   TestDiv 
  10. --- PASS: TestDiv (0.00s) 
  11. FAIL 
  12. FAIL test/shuffle 0.441s 
  13. FAIL 

多次運行,發現執行順序都是你文件中寫好的單元測試順序,我這里是 Add、Minus、Mul、Div。

加上 shuffle flag 后運行:

  1. $ go test -v -shuffle=on ./... 
  2. -test.shuffle 1622383890431866000 
  3. === RUN   TestMul 
  4. --- PASS: TestMul (0.00s) 
  5. === RUN   TestDiv 
  6. --- PASS: TestDiv (0.00s) 
  7. === RUN   TestAdd 
  8.     calc_test.go:27: Add() = 2, want 3 
  9. --- FAIL: TestAdd (0.00s) 
  10. === RUN   TestMinus 
  11. --- PASS: TestMinus (0.00s) 
  12. FAIL 
  13. FAIL test/shuffle 0.177s 
  14. FAIL 

輸出有兩處變化:

  • 多了 -test.shuffle 1622383890431866000,即上面說到的種子。如果不是 on 而是 N,則這里的值就是 N 的值;
  • 順序不確定。你多次運行,發現每次順序可能不一樣;

順便提一句,對于 benchmark,shuffle 這個 flag 也是適用的。

04 有什么用

有人可能會問,這個玩意有啥用?

確實,大部分時候這個特性沒啥用。但如果你不希望測試之間有依賴關系,而擔心實際上依賴了,可以加上這個 flag,以便發現潛在的問題。

其實,這個 flag 早在 2015 年 bradfitz 就提 issue 建議加上,原計劃在 Go1.6 加上的,但沒有人寫提案,因此擱置了。6 年過去了,才加上該功能,可見需求不強烈。日常工作中,你大概率也不會用到,但知曉有這么個東西還是有用處的,萬一需要時,可以用上。

本文轉載自微信公眾號「polarisxu」,可以通過以下二維碼關注。轉載本文請聯系polarisxu公眾號。

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2021-09-05 18:25:30

Go命令倉庫

2021-09-01 07:21:46

堆棧Gopanic

2021-08-30 10:49:39

Go語言編譯器

2020-11-03 09:14:30

編程語言Go技術

2024-09-27 11:38:49

2021-10-18 13:42:52

加密貨幣金融工具

2020-09-29 06:45:49

JDK

2024-01-05 08:37:41

前端項目開發

2015-06-18 11:04:58

2020-12-15 08:05:40

路由器服務器網絡層

2021-07-28 06:51:08

Nacos代理模式

2022-06-06 08:36:02

多租戶模式RabbitMQ

2024-08-05 01:28:26

2015-10-27 11:58:38

蘋果微軟

2018-07-06 00:09:47

2023-03-13 08:09:03

Protobuffeature分割

2020-10-20 17:18:00

戴爾

2022-07-07 19:44:22

Python 3.1

2021-08-28 10:15:26

項目結構Flask
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区国产好 | 国产精品色婷婷久久58 | 精品国产一区二区三区久久影院 | 久久精品国产a三级三级三级 | 国产成人午夜精品影院游乐网 | 国产欧美日韩一区二区三区在线 | 国产精品视频久久久 | 一区| 天天拍天天射 | 国产亚洲精品久久yy50 | www.亚洲视频 | av一级毛片 | 91 在线 | 亚洲影音先锋 | 日本久久网站 | 不卡一区 | av网站免费 | 中文字幕人成乱码在线观看 | 国产成人精品免高潮在线观看 | 国产精品久久久久久久久久 | 色天天综合 | 喷水毛片 | 欧美一级片在线观看 | 欧美日韩亚洲视频 | 久久综合狠狠综合久久综合88 | 一区二区三区日韩精品 | 亚洲欧美日韩电影 | 国产高清91| 国产亚洲精品美女久久久久久久久久 | 精品国产网 | 伊人久久综合 | 99伊人 | 国产精品福利在线 | 国产精品日日夜夜 | 亚洲一区二区三区四区五区午夜 | 91av国产在线视频 | 美女黄网站视频免费 | 欧美午夜视频 | 国产一区二区三区 | 天天碰夜夜操 | 福利片一区二区 |