網站首頁 編程語言 正文
前言
為什么要引用單元測試類
傳統方法的缺點分析
不方便,我們需要在main函數中去調用,這樣就需要去修改main函數,如果現在項目正在運行,就可能去停止項目
不利于管理,因為當我們測試多個函數或者多個模塊時,都需要寫在main函數,不利于我們管理和清晰我們的思路
單元測試基本介紹
Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現單元測試和性能測試,testing框架和其他語言中的測試框架類似,可以基于這個框架寫針對相應函數的測試用例,也可以基于該框架寫相應的壓力測試用例
優點
- 確保每個函數是可運行,并且運行結果是正確的
- 確保寫出來的代碼性能是好的
- 單元測試能及時的發現程序設計或實現的邏輯錯誤,使問題及早暴露,便于問題的定位解決,而性能測試的重點在于發現程序設計的一些問題,讓程序能夠在高并發的情況下還能保持穩定
Testing規范
1.測試用例文件名必須以 _test.go結尾
2.測試用例函數必須以Test開頭,一般來說就是Test+被測試的函數名
3.測試用例函數的形參類型必須是*testing.T
4.一個測試用例文件中,可以由多個測試用例函數
5.當出現錯誤使,可以使用t.Fatalf來格式化輸出錯誤信息,并退出程序
6.t.Logf方法可以輸出相應的日志
7.測試用例函數,并沒有放在main函數中,但是卻執行了main函數
8.pass表示測試用例運行成功,Fail表示測試用例運行失敗
9.測試單個文件,一個要帶上被測試的源文件
go test -v cal_test.go cal.go
10.測試單個方法
go test -v -test.run 函數名
基本使用
cal.go
package main func add(n int)(int){ var sum int for i:=1;i<=n ;i++ { sum+=i } return sum }
cal_test.go
package main import "testing" //函數名規范 Test+要測試的函數名(t *testing) func TestAdd(t *testing.T){ res:=add(9) if(res!=55){ t.Fatalf("add(10)執行錯誤,期望值=%v 實際值=%v\n",55,res) } t.Logf("執行正確!!") }
Golang運行
命令行
案例
monster.go
package monster import ( "encoding/json" "fmt" "io/ioutil" ) type Monster struct { Name string Age int Skill string } func (this *Monster) Store() bool { data,err:=json.Marshal(this) if err!=nil{ fmt.Println("err=",err) return false } filename:="f:/test.ser" err2:=ioutil.WriteFile(filename,data,0666) if err2 !=nil{ fmt.Println("err=",err2) return false } return true } func (this *Monster) ReStore() bool { filename:="f:/test.ser" reader,err2:=ioutil.ReadFile(filename) if err2 !=nil{ fmt.Println("err=",err2) return false } err:=json.Unmarshal(reader,this) if err!=nil{ fmt.Println("err=",err) return false } return true }
monster_test.go
package monster import ( "fmt" "testing" ) func TestStore(t *testing.T) { monster:=&Monster{ Name: "張三", Age: 18, Skill: "打游戲", } flag:=monster.Store() if !flag{ t.Fatalf("monster.Store() 錯誤,期望為%v,實際為%v",true,flag) } t.Logf("monster.Store()測試成功") } func TestRestore(t *testing.T) { var monster=&Monster{} flag:=monster.ReStore() if !flag{ t.Fatalf("monster.ReStore() 錯誤,期望為%v,實際為%v",true,flag) } t.Logf("monster.Store()測試成功") fmt.Println(monster) //&{張三 18 打游戲} }
原文鏈接:https://juejin.cn/post/7146112523429740575
相關推薦
- 2022-06-08 .Net?Core?進程守護之Supervisor使用詳解_實用技巧
- 2023-07-06 springBoot JWT實現websocket的token登錄攔截認證
- 2021-12-14 解決Oracle?11g?導出數據報?“ORA-01455:?轉換列溢出整數數據類型”的問題_ora
- 2022-04-15 Python3之字符串比較_重寫cmp函數方式_python
- 2022-07-02 react 替換頁面頭圖標失敗
- 2022-01-22 記一次線上sql優化從9s到400ms的過程
- 2022-11-09 django中的auth模塊與admin后臺管理方法_python
- 2022-10-06 Python3中常見配置文件寫法匯總_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支