單元測試作用:確認乙個函式或者乙個package引入後的結果是否正確。
傳統方法:測試輸出的結果是否和預期結果一致,
有些東西要放在生產環境做,才能有效,測試環境下沒有這種環境;
不利於管理,所以需要測試框架來解決上述問題。
golang中帶有乙個輕量級的測試框架testing,go 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,浪費了很多位元組的變數。也被稱作保小不保大原則,如果不確定數量就稍微用大一點,因為現在硬體能力已經不是當前計算機的瓶頸。浮點型資料在計...