Go核心開發學習筆記 廿七 單元測試

2021-09-23 13:25:06 字數 3792 閱讀 6770

單元測試作用:確認乙個函式或者乙個package引入後的結果是否正確。

傳統方法:測試輸出的結果是否和預期結果一致,

有些東西要放在生產環境做,才能有效,測試環境下沒有這種環境;

不利於管理,所以需要測試框架來解決上述問題。

golang中帶有乙個輕量級的測試框架testinggo test測試命令來實現單元測試和效能測試(執行**花費時間)。

通過單元測試解決下面問題:

確保每個函式是可執行,並且結果輸出時正確的。

確保寫出來的**效能是好的

單元測試能及時發現程式設計和實現的邏輯錯誤,使用問題及早暴露,便於問題的定位解決。

效能測試的重點在於程式設計上的一些問題,讓程式能夠在高併發的情況下還能保持穩定。

單元測試的使用

測試單獨建立乙個資料夾,用來和main()隔離,測試檔案的執行不需要main()入口。

.go測試檔案中的函式,提取到_test.go檔案中,_test.go需要import testing包。

package tst

import "testing"

func test(t *testing.t)

案例模擬:建立乙個tst包,然後在裡面寫入兩個檔案,accumu.go和accumu_test.go,兩個檔案寫法如下

accumu.go

//>>> accumu.go <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

package tst

func accumu(n int) int

return res

}

accumu_test.go

//>>> accumu_test.go <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//測試單個檔案:切換到此目錄下,go test -v會預設測試所有函式,如果只想測試其中乙個,需要命令 go test -v accumu_test.go accumu.go

//測試單個方法:切換到此目錄下,需要命令 go test -v -test.run accumu

package tst

import (

"testing" //需要匯入testing包

) func testaccumu(t *testing.t)

t.logf("程式測試正確!") //如果測試無異常則列印pass,後面日誌為t.logf()中的字串內容

} //關於測試結果,goland中測試檔案都會有乙個紅色箭頭,因此無需黑屏終端go test命令來使用

測試結果如下:

/*

e:\golear\src\tst>go test -v

=== run testaccumu

--- pass: testaccumu (0.00s)

cal_test.go:12: 程式測試正確!

pass

ok _/e_/golear/src/tst 0.536s

e:\golear\src\tst>go test -v -test.run accumu

=== run testaccumu

--- pass: testaccumu (0.00s)

cal_test.go:12: 程式測試正確!

pass

ok _/e_/golear/src/tst 0.607s

*/

需求:建立乙個結構體:heros

字段:name string, age int, hobby string

方法:store()將結構體變數序列化後儲存到檔案kunkun.txt中

revstore()將結構體變數從檔案kunkun.txt彙總讀取並反序列化

單元測試:測試上述兩個方法是否正常。

核心**段:(假設作為生產,不可以輕易測試)

package main

import (

"bufio"

"encoding/json"

"fmt"

"io/ioutil"

"os"

)type kunfamily struct

func (k *kunfamily) store() bool

file, err := os.openfile("d:/kunkun.txt", os.o_wronly|os.o_create, 0666)

if err != nil

defer file.close()

writer := bufio.newwriter(file)

_, _ = writer.writestring(string(slice))

_ = writer.flush()

return true

}func (k *kunfamily) revstore() bool

//反序列化

err1 := json.unmarshal(byte(content), k) //err := json.unmarshal(byte(string), &被測試檔案寫法:(從生產**段摘出,x.go)

package tst

import (

"bufio"

"encoding/json"

"fmt"

"io/ioutil"

"os"

)type kunfamily struct

func (k *kunfamily) store() bool

file, err := os.openfile("d:/kunkun.txt", os.o_wronly|os.o_create, 0666)

if err != nil

defer file.close()

writer := bufio.newwriter(file)

_, _ = writer.writestring(string(slice))

_ = writer.flush()

return true

}func (k *kunfamily) revstore() bool

err1 := json.unmarshal(byte(content), k) //err := json.unmarshal(byte(string), &測試檔案寫法:(x_test.go)

package tst

import (

"testing"

)func testkunfamily_store(t *testing.t)

res := caixukun.store()

if res != true

t.logf("程式測試正確!")

}func testkunfamily_revstore(t *testing.t)

res := caixukun.revstore()

if res != true

t.logf("程式測試正確!")

}

Go學習筆記 單元測試

在日常開發中,我們通常需要針對現有的功能進行單元測試,以驗證開發的正確性。在go標準庫中有乙個叫做testing的測試框架,可以進行單元測試,命令是go test 測試檔案通常是以xx test.go命名,放在同一包下面。現在假設現在需求是 完成兩個複數相加,我們只需要乙個函式便可以完成該任務。在開...

Go核心開發學習筆記 五 指標

複雜資料型別 指標pointer 陣列array 結構體struct,替代class 管道channel 函式 也是一種函式型別 切片slice 介面inte ce map 類似hashmap,set 比較簡單不複雜,相當於別的語言中的map,僅有此。指標 凡是涉及引用都涉及指標 基本資料型別,變數...

Go核心開發學習筆記 三 基本資料型別

變數的資料型別 浮點型 因地制宜為變數賦予核實的資料型別,例如年齡,一般人不會超過255歲,所以var age byte 就可以了,沒有必要為age賦乙個int64,浪費了很多位元組的變數。也被稱作保小不保大原則,如果不確定數量就稍微用大一點,因為現在硬體能力已經不是當前計算機的瓶頸。浮點型資料在計...