一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - 使用Go進行單元測試的實現

使用Go進行單元測試的實現

2020-05-29 13:37帥氣貓咪 Golang

這篇文章主要介紹了使用Go進行單元測試的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡介

日常開發中, 測試是不能缺少的.

Go 標準庫中有一個叫做 testing 的測試框架, 可以用于單元測試和性能測試.

它是和命令 go test 集成使用的.

測試文件是以后綴 _test.go 命名的, 通常和被測試的文件放在同一個包中.

單元測試

單元測試的格式形如:

?
1
2
3
4
5
6
func TestAbs(t *testing.T) {
 got := Abs(-1)
 if got != 1 {
  t.Errorf("Abs(-1) = %d; want 1", got)
 }
}

在 util 目錄下創建一個文件 util_test.go, 添加一個單元測試:

?
1
2
3
4
5
6
7
8
9
10
11
package util
 
import "testing"
 
// 普通的測試
func TestGenShortID(t *testing.T) {
 shortID, err := GenShortID()
 if shortID == "" || err != nil {
 t.Error("GenShortID failed")
 }
}

然后, 在根目錄下運行 go test -v ./util/, 測試結果如下:

?
1
2
3
4
5
root@592402321ce7:/workspace# go test -v ./util/
=== RUN  TestGenShortID
--- PASS: TestGenShortID (0.00s)
PASS
ok   tzh.com/web/util    0.006s

性能測試

性能測試的結果形如:

?
1
2
3
4
5
func BenchmarkHello(b *testing.B) {
 for i := 0; i < b.N; i++ {
  fmt.Sprintf("hello")
 }
}

在 util_test.go 添加性能測試:

?
1
2
3
4
5
6
// 性能測試
func BenchmarkGenShortID(b *testing.B) {
 for i := 0; i < b.N; i++ {
 GenShortID()
 }
}

運行結果如下(使用 --run=none 避免運行普通的測試函數, 因為一般不可能有函數名匹配 none):

?
1
2
3
4
5
6
7
root@592402321ce7:/workspace# go test -v -bench="BenchmarkGenShortID$" --run=none ./util/
goos: linux
goarch: amd64
pkg: tzh.com/web/util
BenchmarkGenShortID-2       507237       2352 ns/op
PASS
ok   tzh.com/web/util    1.229s

這說明, 平均每次運行 GenShortID() 需要 2352 納秒.

性能分析

運行測試的時候, 可以指定一些參數, 生成性能文件 profile.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
-blockprofile block.out
  Write a goroutine blocking profile to the specified file
  when all tests are complete.
  Writes test binary as -c would.
 
-blockprofilerate n
  Control the detail provided in goroutine blocking profiles by
  calling runtime.SetBlockProfileRate with n.
  See 'go doc runtime.SetBlockProfileRate'.
  The profiler aims to sample, on average, one blocking event every
  n nanoseconds the program spends blocked. By default,
  if -test.blockprofile is set without this flag, all blocking events
  are recorded, equivalent to -test.blockprofilerate=1.
 
-coverprofile cover.out
  Write a coverage profile to the file after all tests have passed.
  Sets -cover.
 
-cpuprofile cpu.out
  Write a CPU profile to the specified file before exiting.
  Writes test binary as -c would.
 
-memprofile mem.out
  Write an allocation profile to the file after all tests have passed.
  Writes test binary as -c would.
 
-memprofilerate n
  Enable more precise (and expensive) memory allocation profiles by
  setting runtime.MemProfileRate. See 'go doc runtime.MemProfileRate'.
  To profile all memory allocations, use -test.memprofilerate=1.
 
-mutexprofile mutex.out
  Write a mutex contention profile to the specified file
  when all tests are complete.
  Writes test binary as -c would.
 
-mutexprofilefraction n
  Sample 1 in n stack traces of goroutines holding a
  contended mutex.

使用下面的命令, 生成 CPU 的 profile:

?
1
go test -v -bench="BenchmarkGenShortID$" --run=none -cpuprofile cpu.out ./util/

當前目錄下, 應該會生成 cpu.out 文件和 util.test 文件.

使用下面的命令, 觀察耗時操作:

?
1
2
3
# 進入交互模式
go tool pprof cpu.out
top

安裝 Graphviz 后可以生成可視化的分析圖.

?
1
2
apt install graphviz
go tool pprof -http=":" cpu.out

測試覆蓋率

?
1
2
3
4
5
6
7
8
9
10
11
12
13
root@592402321ce7:/workspace# go test -v -coverprofile=cover.out ./util/
=== RUN  TestGenShortID
--- PASS: TestGenShortID (0.00s)
PASS
coverage: 9.1% of statements
ok   tzh.com/web/util    0.005s coverage: 9.1% of statements
 
root@592402321ce7:/workspace# go tool cover -func=cover.out
tzh.com/web/util/util.go:12:  GenShortID   100.0%
tzh.com/web/util/util.go:17:  GetReqID    0.0%
tzh.com/web/util/util.go:22:  TimeToStr    0.0%
tzh.com/web/util/util.go:30:  GetTag     0.0%
total:             (statements)  9.1%

使用 -coverprofile=cover.out 選項可以統計測試覆蓋率.使用 go tool cover -func=cover.out 可以查看更加詳細的測試覆蓋率結果,
統計每個函數的測試覆蓋率.

總結

測試是開發中非常重要的一個環節, 用于保證軟件質量, 切不可偷懶.

當前部分的代碼

作為版本 v0.15.0

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://juejin.im/post/5dc37eb8e51d452a066999bf

延伸 · 閱讀

精彩推薦
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
主站蜘蛛池模板: 西施打开双腿下面好紧 | 男生操男生 | 欧美日韩国产另类一区二区三区 | 国内激情自拍 | 99在线精品免费视频九九视 | 日韩一区二区三区免费 | 精品免费视在线观看 | 果冻传媒i91media免费 | 王雨纯羞羞| 99国产成人精品2021 | 动漫美女被褥吸奶漫画漫画 | 天天躁天天碰天天看 | 婷婷综合缴情亚洲五月伊 | 特级www| 人人做人人爽人人爱 | 国产伦码精品一区二区 | 午夜精品久久久内射近拍高清 | 国产梦呦精品 | 亚洲七七久久综合桃花 | 好猛好紧好硬使劲好大刺激视频 | 国产精品天天在线 | 九9热这里只有真品 | 久久观看视频 | 富士av105 | 亚洲男人精品 | 午夜办公室在线观看高清电影 | 亚洲国产欧美另类 | 国产精品第四页 | 欧美一级在线 | 亚洲麻豆精品果冻传媒 | 日本妇人成熟免费观看18 | 成人激情| 欧美三茎同入 | 欧美一级久久久久久久大片 | 人妖三级 | 日本96在线精品视频免费观看 | 欧美 国产 日韩 第一页 | 动漫jk美女被爆羞羞漫画 | 亚洲欧美天堂 | 亚洲天堂精品在线观看 | 四虎影音先锋 |