您好,登錄后才能下訂單哦!
本篇內容主要講解“Go語言單元測試和基準測試實例代碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Go語言單元測試和基準測試實例代碼分析”吧!
測試的出現是為了避免項目中出現重大事故
測試是避免事故的最后一道屏障
單元測試的覆蓋率在一定程度上而言,決定了代碼的質量
通過測試單元的輸出與期望值進行校對從而驗證代碼的正確性,從而保證新舊代碼的互不影響與程序的正常運行。
進而單元測試較于編譯更易于在較短的周期內發現和定位代碼中的錯誤使損失最小化從而提升效率。所以寫單元測試是很有必要的。
Golang單元測試對文件名和方法名,參數都有很嚴格的要求。
文件名必須以xx_test.go
命名
方法必須是Test[^a-z]
開頭
方法參數必須t *testing.T
初始化邏輯放到TestMain中
使用go test
執行單元測試
通過第三方包assert演示單元測試
判斷函數測試值與期望值是否一致
import( "github.com/stretchr/testify/assert" "testing" ) func TestHelloTom(t *testing.T) { output := HelloTom() expectOutput := "Tom" assert.Equal(t, expectOutput, output) } func HelloTom() string { return "Tom" }
覆蓋率出現的目的:
衡量代碼是否經過了足夠的測試
評價項目的測試水準
評估項目是否達到了高水準測試等級
通過go test命令測試函數的覆蓋率
// judgment.go func JudgePassLine(score int16) bool { if score >= 60 { return true } else { return false } } // judgment_test.go func TestJudgePassLineTrue(t *testing.T) { isPass := JudgeePassLine(70) assert.Equal(t, true, isPass) } func TestJudgePassLineFalse(t *testing.T) { isPass := JudgeePassLine(50) assert.Equal(t, false, isPass) } /* 通過go test 命令測試覆蓋率 go test judgment_test.go judgment.go --cover */
一般覆蓋率:50%~60%
,較高覆蓋率:80%+
測試分支相互獨立、全面覆蓋
對于上述案例代碼而言
應出現成績大于等于60 和小于60的測試用力
測試單元粒度足夠小,函數單一職責
冪等:重復運行同一個case,結果與之前一致
穩定:指單元測試相互隔離,可以獨立運行
當測試文件被修改后,可能會導致測試失敗或錯誤率增高
從而出現了Mock函數
func ReadFirstLine() string { open, err := os.Open("log") // 打開一個文件 defer open.Close() if err != nil { return "" } scanner := bufio.NewScanner(open) // 對每行進行遍歷 for scanner.Scan() { return scanner.Text() } return "" } func ProcessFirstLine() string { line := ReadFirstLine() destLine := strings.ReplaceAll(line, "11", "00") // 替換11為00 return destLine } func TestProcessFirstLine(t *testing.T) { // 執行單元測試 firstLine := ProcessFirstLine() assert.Equal(t, "line00", firstLine) }
monkey: github.com/bouk/monkey 這是一個開源的mock測試庫,可以對method或者實例的方法進行mock
Monkey Patch的作用域在Runtime, 運行時通過Go的unsafe包能夠將內存中函數的地址替換為運行時函數的地址,將待打樁函數或方法的實現跳轉。
Mock函數不僅可以為一個函數打樁 也可以為一個方法打樁
// 用函數A去替換函數B,B就是原函數,A就是打樁函數 func Patch(target, replacement interface{}) *PatchGuard { // target就是原函數,replacement就是打樁函數 t := reflect.ValueOf(target) r := reflect.ValueOf(replacement) patchValue(t, r) return &PatchGuard{t, r} } func Unpatch(target interface{}) bool { // 保證了在測試結束之后需要把這個包卸載掉 return unpatchValue(reflect.ValueOf(target)) } func TestProcessFirstLineWithMock(t *testing.T) { monkey.Patch(ReadFirstLine, func() string { return "line110" }) defer monkey.Unpatch(ReadFirstLine) line := ProcessFirstLine() assert.Equal(t, "line000", line) } // 通過patch對ReadFirstLine進行打樁mock,默認返回line110,通過defer卸載mock // 這樣整個測試函數就擺脫了本地文件的束縛和依賴
基準測試是指測試一段程序的性能及耗費CPU的程度;
在實際的項目開發中,經常會遇到代碼性能瓶頸,為了定位問題,經常要對代碼做性能分;
這時就用到了基準測試,其使用方法與單元測試類似。
優化代碼,需要對當前代碼分析
內置的測試框架提供了基準測試的能力
到此,相信大家對“Go語言單元測試和基準測試實例代碼分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。