Go語言自帶了 testing 測試包,可以進(jìn)行自動化的單元測試,輸出結(jié)果驗(yàn)證,并且可以測試性能。
創(chuàng)新互聯(lián)建站"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)建站具備承接各種類型的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作項(xiàng)目的能力。經(jīng)過10年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評。
為什么需要測試
完善的測試體系,能夠提高開發(fā)的效率,當(dāng)項(xiàng)目足夠復(fù)雜的時候,想要保證盡可能的減少 bug,有兩種有效的方式分別是代碼審核和測試,Go語言中提供了 testing 包來實(shí)現(xiàn)單元測試功能。
測試規(guī)則
要開始一個單元測試,需要準(zhǔn)備一個 go 源碼文件,在命名文件時文件名必須以_test.go結(jié)尾,單元測試源碼文件可以由多個測試用例(可以理解為函數(shù))組成,每個測試用例的名稱需要以 Test 為前綴,例如:
func TestXxx( t *testing.T ){
//......
}
之前寫過了Go語言gorm框架MySQL實(shí)踐,其中對gorm框架在操作MySQL的各種基礎(chǔ)實(shí)踐,下面分享一下如何使用gorm框架對MySQL直接進(jìn)行性能測試的簡單實(shí)踐。
這里我使用了一個原始的Go語言版本的 FunTester 測試框架,現(xiàn)在只有一個基本的方法,實(shí)在是因?yàn)镚o語言特性太強(qiáng)了??蚣茉O(shè)計(jì)的主要思路之一就是利用Go語言的閉包和方法參數(shù)特性,將一個 func() 當(dāng)做性能測試的主題,通過不斷運(yùn)行這個 func() 來實(shí)現(xiàn)性能測試。當(dāng)然還有另外一個思路就是運(yùn)行一個多線程任務(wù)類,類似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象類,這樣可以設(shè)置一些類的屬性,綁定一些測試資源,適配更多的測試場景。
下面演示select的性能測試,這里我用了隨機(jī)ID查詢的場景。
這里我使用從35開始遞增的ID進(jìn)行刪除。
這里使用了select的用例部分,隨機(jī)ID,然后更新name字段,隨機(jī)10個長度的字符串。
這里用到了 FunTester 字段都是隨機(jī)生成。
到這里可以看出,性能測試框架用到的都是gorm框架的基礎(chǔ)API使用,這里MySQL連接池的管理工作完全交給了gorm框架完成,看資料說非常牛逼,我們只需要設(shè)置幾個參數(shù)。這個使用體現(xiàn)很像 HttpClient 設(shè)置 HTTP 連接池類似,這里我們也可以看出這些優(yōu)秀的框架使用起來都是非常簡單的。
PS:關(guān)于gorm的基礎(chǔ)使用的請參考上一期的文章Go語言gorm框架MySQL實(shí)踐。
之前寫過了Grpc服務(wù)開發(fā)和接口測試初探【Java】,中間耽擱了一些時間,Go版本的gRPC測試開發(fā)實(shí)踐才有時間學(xué)習(xí)使用。其中也是由于自己Go語言不夠熟悉導(dǎo)致的。之前有段時間想暫時放棄Go語言的學(xué)習(xí),導(dǎo)致了Go的生疏,原因是從Groovy到Java性能。
回歸正題,Go語言版本的gRPC實(shí)踐相對Java來說是比較簡單的,但是總體的工具鏈?zhǔn)潜容^復(fù)雜的,可能是因?yàn)镚o生態(tài)目前相比Java還是比較匱乏吧。下面我先簡述一下大致的步驟:
以上步驟親自操作可能會遇到一些小問題,我本人搜到的教程什么的也是亂七八糟,踩了一些坑。我沒有整理出一個親自實(shí)踐之后的可行的教程,原因有二:
Go語言的gRPC的 proto 編寫跟Java大致一致,只有一個報(bào)名的參數(shù)不太一樣。下面是我的 Hello.proto 內(nèi)容:
這里主要 go_package 網(wǎng)上搜到的配置方式有些不一樣,我沒有全都嘗試,大家在搜索的資料時候,盡量先看看 syntax 這個參數(shù)的值,以及文章教程寫作的時間,如果距離現(xiàn)在太久了,我建議直接關(guān)掉。搜索引擎有過濾功能,可以過濾掉過時的教程。
這里Go語言gRPC的一點(diǎn)優(yōu)勢,就是在一個項(xiàng)目中即可實(shí)現(xiàn),Java需要先弄一個SDK這樣。Go語言的gRPC的代碼可以通過生成代碼命令中的參數(shù)實(shí)現(xiàn)指定路徑。我是放在了和 proto 文件的同級目錄。
服務(wù)端代碼也是比較格式化的內(nèi)容,如下:
其中 pb.RegisterHelloServiceServer(s, Ser{}) 如果報(bào)錯,請檢查自己安裝的工具 protoc-gen-go 或者 protoc-gen-gofast 版本,一般提取報(bào)錯 message 搜索也能得到解決辦法。
下面是客戶端的代碼,由于學(xué)藝不精,其中大部分參數(shù)的含義目前我也不是很清楚,特別是基于 stream 的請求響應(yīng)的方式使用。后面我先把Java的學(xué)完,再回過頭來看Go的,按照這個順序?qū)W習(xí)和分享。
服務(wù)端輸出:
忘記打日志了。沒有輸出
客戶端輸出:
Go語言的gRPC測試開發(fā)實(shí)踐已經(jīng)完事兒,大概率上我不會在工作中使用Go作為主力gRPC測試語言,后面測試實(shí)踐內(nèi)容還是會以Java為主。
k6是新興的性能測試框架,比肩jmeter,另外測試腳本使用js,更加適合自動化的架構(gòu)。
k6啟動的框架是使用golang的cli標(biāo)準(zhǔn)框架cobra,入口函數(shù)
進(jìn)入cobra框架后,我們直接查看getRunCmd,這個是命令run的入口,主要工作都是從這里開始。
重點(diǎn)關(guān)注初始化Runner,這個是通過js腳本,使用goja庫解析后,生成的實(shí)際執(zhí)行單元。
進(jìn)入js目錄,查看Runner的結(jié)構(gòu),runner.go
Runner有一些配置屬性,另外還有方法,方法用lib.Runner的接口進(jìn)行規(guī)范。
Runner有一個NewVU方法,里面定義了連接參數(shù),實(shí)現(xiàn)api測試
返回主函數(shù),在初始化完成Runner后,啟動調(diào)度器,以及做結(jié)果收集
最終封裝成一個engine
啟動測試