偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Golang 語(yǔ)言怎么編寫測(cè)試代碼?

開(kāi)發(fā) 后端
我們使用 Golang 語(yǔ)言開(kāi)發(fā)的項(xiàng)目,怎么保證邏輯正確和性能要求呢?也就是說(shuō)我們?nèi)绾螠y(cè)試我們的 Golang 代碼呢?在 Golang 語(yǔ)言中,可以使用標(biāo)準(zhǔn)庫(kù) testing 包編寫單元測(cè)試和基準(zhǔn)測(cè)試,使用 go test 命令執(zhí)行單元測(cè)試和基準(zhǔn)測(cè)試的代碼。

[[427939]]

01介紹

我們使用 Golang 語(yǔ)言開(kāi)發(fā)的項(xiàng)目,怎么保證邏輯正確和性能要求呢?也就是說(shuō)我們?nèi)绾螠y(cè)試我們的 Golang 代碼呢?在 Golang 語(yǔ)言中,可以使用標(biāo)準(zhǔn)庫(kù) testing 包編寫單元測(cè)試和基準(zhǔn)測(cè)試,使用 go test 命令執(zhí)行單元測(cè)試和基準(zhǔn)測(cè)試的代碼。本文我們介紹在 Golang 語(yǔ)言中怎么編寫測(cè)試代碼。

02命名規(guī)范

在 Golang 語(yǔ)言中編寫測(cè)試代碼,需要遵循一些命名規(guī)范,包含文件名、包名、函數(shù)(方法)名和變量名。

文件名和包名

測(cè)試文件名以 _test.go 結(jié)尾,go test 工具可以遍歷以 _test.go 結(jié)尾的文件,執(zhí)行測(cè)試函數(shù)。而 go build 和 go run 會(huì)忽略以 _test.go 結(jié)尾的文件,文件名開(kāi)頭一般是被測(cè)試函數(shù)所在的文件名。

包名一般和被測(cè)試文件的包名相同,這樣即可以測(cè)試被測(cè)試文件的可導(dǎo)出函數(shù)和不可導(dǎo)出函數(shù)。

函數(shù)名和方法名

測(cè)試函數(shù)(方法)名必須以 Test、Benchmark 和 Example 開(kāi)頭,并且必須是可導(dǎo)出函數(shù)。函數(shù)名一般是被測(cè)試函數(shù)名,首字母大寫。如果我們需要給同一個(gè)函數(shù)編寫多個(gè)測(cè)試函數(shù),可以在函數(shù)名后接上測(cè)試函數(shù)的場(chǎng)景,例如:TestXxxxXxxx。

變量名

測(cè)試函數(shù)(方法)的變量名,Golang 語(yǔ)言和 go test 工具沒(méi)有明確的約束,但是,社區(qū)針對(duì)輸出結(jié)果有一些規(guī)范供大家參考。在編寫單元測(cè)試代碼時(shí),一般會(huì)得到一個(gè)實(shí)際輸出結(jié)果,和一個(gè)我們預(yù)期的輸出結(jié)果做對(duì)比。針對(duì)這兩個(gè)變量,社區(qū)的變量名規(guī)范是 got/want 或 expected/actual。

03編寫測(cè)試代碼

單元測(cè)試

所謂單元測(cè)試,顧名思義就是對(duì)單元進(jìn)行測(cè)試,一般進(jìn)行測(cè)試的單元是一個(gè)最小的單元,在 Golang 語(yǔ)言中,最小的單元就是指一個(gè)函數(shù)或方法。

單元測(cè)試的函數(shù),函數(shù)名以 Test 開(kāi)頭,例如:TestXxx。參數(shù)必須是 *testing.T 類型,可以使用該類型的方法記錄測(cè)試信息和測(cè)試狀態(tài)。例如,一般使用 Log 和 Logf 記錄測(cè)試信息,使用 Error、Errorf、Fatal 和 Fatalf 方法記錄測(cè)試狀態(tài),該類型的更多方法可以閱讀官方文檔。

被測(cè)試函數(shù):

  1. func Sum(a, b intint { 
  2.  return a+b 

測(cè)試函數(shù):

  1. func TestSum(t *testing.T) { 
  2.  a, b := 1,2 
  3.  rst := Sum(a, b) 
  4.  if rst == 3 { 
  5.   t.Logf("expected=%d, actual=%d", 3, rst) 
  6.  } else { 
  7.   // t.Errorf("expected=%d, actual=%d", 3, rst) 
  8.   t.Fatalf("expected=%d, actual=%d", 3, rst) 
  9.  } 
  10.  t.Log("done"

閱讀上面這段代碼,是我們編寫的 Sum 函數(shù)的單元測(cè)試,給定 a, b 兩個(gè)變量作為 Sum 函數(shù)的輸入?yún)?shù),此外,我們還可以使用表格測(cè)試發(fā),給定一組被測(cè)試函數(shù)的輸入?yún)?shù),限于篇幅,本文不準(zhǔn)備花費(fèi)篇幅介紹。

使用 go test 命令執(zhí)行以上單元測(cè)試的代碼:

  1. go test 
  2. PASS 
  3. ok      learn_go/lesson27       0.555s 

go test 命令遍歷所有 _test.go 結(jié)尾的文件,執(zhí)行文件中所有的測(cè)試函數(shù)。此外,go test 支持一些參數(shù),例如,-v 輸出測(cè)試函數(shù)的運(yùn)行詳情;-run 指定執(zhí)行的測(cè)試函數(shù);-count 指定執(zhí)行次數(shù)。

此外,使用參數(shù) --coverprofile 統(tǒng)計(jì)單元測(cè)試的覆蓋率。

  1. go test --coverprofile=func.cover 
  2. PASS 
  3. coverage: 100.0% of statements 
  4. ok      learn_go/lesson27       0.499s 

閱讀上面的執(zhí)行結(jié)果,可以發(fā)現(xiàn)我們編寫的單元測(cè)試覆蓋率為 100%。

如果我們想要查看詳細(xì)的覆蓋率統(tǒng)計(jì)結(jié)果,我們可以執(zhí)行以下命令生成 html 文件,使用瀏覽器打開(kāi)生成的 html 文件,可以查看詳細(xì)的單元測(cè)試覆蓋率統(tǒng)計(jì)結(jié)果。

  1. go tool cover -html=func.cover -o func_cover.html 

運(yùn)行以上命令,會(huì)生成一個(gè)名為 func_cover.html 的文件,我們可以使用瀏覽器打開(kāi)它,查看詳細(xì)的單元測(cè)試覆蓋率統(tǒng)計(jì)結(jié)果。

基準(zhǔn)測(cè)試

在 Golang 語(yǔ)言中,可以使用基準(zhǔn)測(cè)試查看代碼的性能?;鶞?zhǔn)測(cè)試的函數(shù)名以 Benchmark 開(kāi)頭,例如:BenchmarkXxx。參數(shù)必須是 *testing.B 類型,函數(shù)體中 for 循環(huán)的條件,以 b.N 作為循環(huán)次數(shù),它是基準(zhǔn)測(cè)試框架提供的,它在 Golang 運(yùn)行時(shí)動(dòng)態(tài)調(diào)整,通過(guò)多次測(cè)試,得到性能評(píng)估結(jié)果。

示例代碼:

  1. func BenchmarkSum(b *testing.B) { 
  2.  for i := 0; i < b.N; i++ { 
  3.   Sum(1, 2) 
  4.  } 

我們可以使用 go test 工具執(zhí)行以上基準(zhǔn)測(cè)試的代碼,基準(zhǔn)測(cè)試函數(shù)不會(huì)自動(dòng)執(zhí)行,必須使用參數(shù) -bench。

  1. go test -bench=".*" 
  2. goos: darwin 
  3. goarch: amd64 
  4. pkg: learn_go/lesson27 
  5. cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz 
  6. BenchmarkSum-16         1000000000               0.2325 ns/op 
  7. PASS 
  8. ok      learn_go/lesson27       0.748s 

閱讀上面的執(zhí)行結(jié)果,我們主要介紹一下 BenchmarkXxx-n 這一行的意思。這一行共有三列,第一列 BenchmarkSum-16 分別代表基準(zhǔn)測(cè)試的函數(shù)名和參與基準(zhǔn)測(cè)試的 CPU 線程數(shù),默認(rèn)是 GOMAXPROCS 的值。第二列 1000000000 表示基準(zhǔn)測(cè)試循環(huán)執(zhí)行的次數(shù)。第三列 0.2325 ns/op 表示每次循環(huán)的平均執(zhí)行耗時(shí)是 0.2325 納秒,該值越小,說(shuō)明代碼性能越高。

除了 b.N 之外,還有幾個(gè)關(guān)于性能測(cè)試時(shí)間計(jì)數(shù)的方法,例如:b.ResetTimer()、b.StopTimer() 和 b.StartTimer(),我們可以根據(jù)我們的測(cè)試場(chǎng)景,靈活使用。

此外,go test 工具關(guān)于基準(zhǔn)測(cè)試的參數(shù),除了參數(shù) -bench 之外,還有 -benchmem 統(tǒng)計(jì)內(nèi)存分配;-cpu 指定參與執(zhí)行基準(zhǔn)測(cè)試的 CPU 線程數(shù);-benchtime 指定測(cè)試時(shí)間和循環(huán)次數(shù),其中值的單位為 s 表示指定執(zhí)行多少秒,單位為 x 表示指定循環(huán)執(zhí)行次數(shù);-timeout 指定基準(zhǔn)測(cè)試函數(shù)執(zhí)行的超時(shí)時(shí)間。

04總結(jié)

本文我們介紹怎么編寫測(cè)試代碼,包含單元測(cè)試和基準(zhǔn)測(cè)試。特別需要注意的是一些命名規(guī)范。

養(yǎng)成編寫測(cè)試代碼的習(xí)慣,不僅可以降低代碼邏輯的錯(cuò)誤率,而且在多人開(kāi)發(fā)中,還可以提升聯(lián)調(diào)效率和提測(cè)通過(guò)率。

本文轉(zhuǎn)載自微信公眾號(hào)「Golang語(yǔ)言開(kāi)發(fā)棧」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang語(yǔ)言開(kāi)發(fā)棧公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Golang語(yǔ)言開(kāi)發(fā)棧
相關(guān)推薦

2021-09-26 10:20:06

開(kāi)發(fā)Golang代碼

2021-09-13 05:02:49

GogRPC語(yǔ)言

2021-06-09 23:36:46

Golang語(yǔ)言版本

2021-12-13 01:24:14

語(yǔ)言Golang panic

2021-06-29 23:40:19

Golang語(yǔ)言并發(fā)

2016-11-30 18:35:03

JavaScript

2023-09-11 11:05:49

軟件開(kāi)發(fā)TDD

2021-06-07 23:19:44

Golang語(yǔ)言 Defer

2021-11-08 23:09:07

Go排序數(shù)據(jù)

2021-10-26 09:26:21

編程技能開(kāi)發(fā)

2021-10-31 23:01:50

語(yǔ)言拼接字符串

2019-07-29 09:19:26

編程語(yǔ)言PythonJava

2021-01-29 08:56:13

Golang標(biāo)準(zhǔn)庫(kù)函數(shù)

2021-07-12 05:05:59

Golang語(yǔ)言字段

2022-01-04 23:13:57

語(yǔ)言PanicGolang

2023-12-19 22:40:23

Golang編程函數(shù)

2023-12-18 10:01:40

Golang代碼開(kāi)發(fā)

2021-05-28 08:58:41

Golang網(wǎng)卡metrics

2022-01-09 23:04:19

語(yǔ)言打印結(jié)構(gòu)體

2024-05-11 09:41:45

線程安全代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)