Go語言- 單元測試

實際開發中,需要保證單元功能正確。

傳統方式:在main函數中直接調用,查看結合是否和預期一致。

缺點:1. 不方便 2. 不利于管理?

因此,單元測試具有必要性

testing測試框架

Go語言中自帶testing輕量級測試框架和go test命令來實現單元測試和性能測試。可以解決以下問題:

1. 確保每個函數可運行并且結果正確

2. 確保單元代碼的性能

3. 盡早發現錯誤

入門實例以及解析

需求:在service包下有一個函數addUpper需要測試。

解決方式:在service包下創建一個xxx_test.go文件,創建一個測試用例,代碼如下:

package serviceimport(_ "fmt""testing" //引入testing測試框架
)// 編寫一個測試用例,測試同包下addUpper函數是否正確
func TestAddUpper(t *testing.T){// 調用res := addUpper(10)if res != 55{t.Fatalf("AddUpper執行錯誤,期望值%v,實際值%v", 55, res)}// 如果正確,就輸出日志t.Logf("執行正確...")
}

使用命令行調用testing框架進行測試。

go test:Go 的測試命令,會自動查找當前目錄及其子目錄中所有以 _test.go 結尾的文件,并運行其中的測試函數。

-v(verbose):啟用“詳細輸出”模式。在該模式下,測試過程中會打印出每個測試函數的執行情況(包括測試通過與否、執行順序等),而不是只顯示最終結果。

在 Go 的測試中,使用 t.Log("...") 或 t.Logf("format", args...) 輸出的日志信息,默認只輸出到控制臺(終端),并不會自動寫入文件或其他地方。如果需要寫入.log文件需要指定。

PASS表示運行成功,FAIL表示運行失敗。

1. 測試文件命名必須是?xxx_test.go
2. 測試函數名必須以?Test?開頭且Test后一位必須為大寫,如?TestSomething(t *testing.T)
3. 只有在包目錄中有?_test.go?文件時,go test?才會運行測試

4. 所有用于執行單元測試的函數(即以 Test 開頭的函數)都必須使用 t *testing.T 作為唯一的參數

5. 一個xxx_test.go文件中可以有多個測試函數,以測試一個包中不同的單元。

在測試函數中直接調用被測試函數即可,對結果進行判斷,使用t的方法進行輸出。

運行一個_test.go文件

go test自動查找當前目錄及其子目錄中所有以 _test.go 結尾的文件,但是如果想指定 _test.go文件,就在命令行中指定:

go test -v cal_test.go cal.go

go test:Go 的測試命令,用于運行測試。
-v:表示“verbose(詳細輸出)”,會顯示每個測試函數的執行情況。
cal_test.go:測試文件,里面包含以?TestXXX?開頭的測試函數。
cal.go:普通 Go 源文件,通常是你想測試的代碼邏輯所在文件。

運行一個測試用例

go test -v -run ^TestAddUpper$
或者
go test -v -run TestAddUpper

這樣只會運行該包下指定的一個測試用例,?^ 和 $ 是正則表達式符號,表示完全匹配函數名。不加也可以,但建議加上更精確。

單元測試綜合案例

需求

構建結構體Monster,結構體兩個方法Store和ReStore進行序列化和反序列化。

編寫測試用例測試兩個方法。

Monster結構體和方法代碼:

package mainimport ("encoding/json""fmt""os"
)type Monster struct {Name  string `json:"name"`Age   int    `json:"age"`Skill string `json:"skill"`
}func (m *Monster) Store(filename string) error {// 序列化變量并保存到當前目錄data, err := json.Marshal(m)if err != nil {return err}return os.WriteFile(filename, data, 0644)
}func (m *Monster) ReStore(filename string) error {// 反序列化變量并保存到當前目錄data, err := os.ReadFile(filename)if err != nil {return err}return json.Unmarshal(data, m)
}func main() {// m := Monster{// 	Name:  "牛魔王",// 	Age:   800,// 	Skill: "魔王拳",// }// m.Store("MonsterJson.json")var m Monsterm.ReStore("MonsterJson.json")fmt.Println(m)
}

_test.go文件代碼:

package mainimport ("os""reflect""testing"
)const testFile string = "monster.json"func TestStore(t *testing.T) {m := &Monster{Name:  "Dracula",Age:   500,Skill: "吸血",}err := m.Store(testFile)if err != nil {t.Fatalf("存儲失敗:%v", err)}// 檢查文件是否存在if _, err := os.Stat(testFile); os.IsNotExist(err) {t.Fatal("文件未生成")}// 清理測試文件os.Remove(testFile)
}// TestRestore 測試 Restore 方法
func TestRestore(t *testing.T) {// 準備一個測試文件內容expected := &Monster{Name:  "Frankenstein",Age:   200,Skill: "雷電之力",}// 先將預期對象存入文件err := expected.Store(testFile)if err != nil {t.Fatalf("準備測試文件失敗:%v", err)}// 創建一個新的 Monster 實例并恢復數據var restored Monstererr = restored.ReStore(testFile)if err != nil {t.Fatalf("恢復失敗:%v", err)}// 使用reflect.DeepEqual判斷兩個值是否深度一致if !reflect.DeepEqual(expected, &restored) {t.Errorf("期望值 %v,實際值 %v", expected, restored)}// 清理測試文件os.Remove(testFile)
}

結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86397.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86397.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue移動端開發的適配方案與性能優化技巧

文章目錄 1. 移動端適配方案1.1. 視口適配1.2. 基于rem/em的適配方案1.3. vw/vh視口單位適配1.4. 移動端UI組件庫適配 2. 移動端性能優化技巧2.1. 虛擬列表實現長列表優化2.2. 圖片懶加載與優化2.3. 減少首屏加載時間2.4. 事件節流與防抖 3. 移動端常見問題解決方案3.1. 移動端…

如何微調和部署OpenVLA在機器人平臺上

這個教程來自這個英偉達網址 教程的目標是提供用于部署 VLA 模型的優化量化和推理方法,以及針對新機器人、任務和環境的參考微調流程。在一個自包含的仿真環境中,結合場景生成和領域隨機化(MimicGen)對性能和準確性進行嚴格驗證。…

深入剖析Flink內存管理:架構、調優與實戰指南

在大數據處理領域,Apache Flink憑借強大的流處理和批處理能力備受青睞。而Flink內存管理機制,作為保障作業高效穩定運行的關鍵支柱,深刻影響著任務執行性能、資源利用率以及系統容錯能力。理解并掌握Flink內存管理原理與優化策略,…

【力扣 C】動態規劃專題目錄

【力扣 簡單 C】509. 斐波那契數https://blog.csdn.net/2503_92320911/article/details/148810148 【力扣 中等 C】983. 最低票價https://blog.csdn.net/2503_92320911/article/details/148833421 【力扣 中等 C】91. 解碼方法https://blog.csdn.net/2503_92320911/article/d…

Linux 中如果網絡連接丟失或無法找到網絡設備

如下步驟 1. 檢查網絡服務狀態 sudo systemctl status NetworkManager 如果服務未運行,啟動并啟用它: sudo systemctl start NetworkManager sudo systemctl enable NetworkManager ______ 2. 檢查網絡接口 ip add 確認網卡(如 eth0、en…

【Linux 平臺總線驅動開發實戰】

Linux 平臺總線驅動開發實戰 一、平臺總線驅動基礎概念二、核心數據結構解析2.1 設備結構體 struct platform_device2.2 驅動結構體 struct platform_driver2.3 資源結構體 struct resource 三、驅動開發完整流程3.1 設備注冊3.2 驅動注冊3.3 設備與驅動匹配 四、編譯與測試4.1…

LabVIEW液位上升圖像識別 附件有源碼

源程序在這里https://www.bjcyck.com/nd.jsp?fromColId101&id2675#_np101_331 本LabVIEW 程序實現基于圖像灰度特征的液位上升監測與控制,通過讀取序列液位上升圖像,分析指定區域灰度變化獲取液位斜率,依據設定標記位置實現液位上升到目…

git安裝使用詳細教程

git高速下載 macOS 系統 # 方法1:Homebrew(推薦) brew install git# 方法2:官方安裝包 下載地址:https://sourceforge.net/projects/git-osx-installer/Linux 系統 # Debian/Ubuntu sudo apt update && sudo…

瑪哈特機械矯平機:精密制造的“應力消除師”與“平整度雕刻家”

機械矯平機,作為金屬板材加工鏈中的關鍵一環,其價值遠不止于“壓平”那么簡單。它是材料科學、精密機械與控制技術的結晶,是確保高端制造品質的幕后功臣。本文將深入探討其核心機理、進階應用及未來方向。 一、 矯平機理再探:超越…

四色(定理/猜想)染色算法小軟件Version1.11 2025.6.24 開發者:孝感動天/臥冰求鯉

四色(定理/猜想)染色算法小軟件Version1.11 2025.6.24 開發者:孝感動天/臥冰求鯉 開發者:路人甲/打醬油 開發者:四色定要治理/四鄰不安/相鄰必反/草木皆兵/圍棋緊箍/不是我~干的/和我無關 開發者:不是我/不是我干的&#xff0c…

SQL 分頁方法全解析:從基礎到高級應用

一、引言 在 Web 應用和數據分析中,分頁是處理大量數據的必備功能。想象一下,如果沒有分頁,社交媒體的動態流、電商平臺的商品列表都將變成無窮無盡的長頁面,用戶體驗和系統性能都會受到嚴重影響。本文將深入探討 SQL 中各種分頁方…

STM32 adc采集數據存到SD卡中

F1板子實現adc采集模擬信號存儲到SD卡中 STM32 adc采集數據存到SD卡中/STM32SD文件系統ADC采集/AD/adc_dma.c , 10291 STM32 adc采集數據存到SD卡中/STM32SD文件系統ADC采集/AD/adc_dma.h , 661 STM32 adc采集數據存到SD卡中/STM32SD文件系統ADC采集/CMSIS/core_cm3.c , 17273…

redis8.0新特性:布谷鳥過濾器(Cuckoo Filter)詳解

文章目錄 一、寫在前面二、使用1、CF.RESERVE 創建布谷鳥過濾器2、CF.ADD 添加元素3、CF.ADDNX 不存在才添加4、CF.COUNT 判斷元素添加次數5、CF.DEL 刪除一次元素6、CF.EXISTS 判斷元素是否存在7、CF.MEXISTS 批量判斷元素是否存在8、CF.INFO 查看布谷鳥過濾器信息9、CF.INSER…

2025 Java秋招『面試避坑指南』:牛客網高頻題分類精講

前言 今天為大家整理了目前互聯網出現率最高的大廠面試題,所謂八股文也就是指文章的八個部分,文體有固定格式:由破題、承題、起講、入題、起股、中股、后股、束股八部分組成,題目一律出自四書五經中的原文。 初中級和中高級都有&#xff0c…

git安裝使用和git命令大全

Git高速下載 程序員面試資料大全|各種技術書籍等資料-1000G Git 命令大全 一、基礎操作 1. 初始化與克隆 命令說明示例git init初始化本地倉庫git initgit clone克隆遠程倉庫git clone https://github.com/user/repo.gitgit remote add添加遠程倉庫git remote ad…

非常好用的markdown轉pdf工具

在文檔處理和知識管理中,Markdown因其簡潔易讀的特性而廣受歡迎,而PDF格式則因其廣泛的兼容性和穩定性而被廣泛用于文檔分享和存檔。然而,將Markdown文檔高效地轉換為PDF格式,同時保留格式和樣式,一直是許多用戶的需求…

八股文——JAVA基礎:基本數據類型與包裝類的區別

基本數據類型包含八種, 1.用途不同,在目前編程而言,基本除了使用局部變量會使用基本數據類型外,都會去使用包裝類。包裝類能夠適用泛型是目前企業編程使用包裝類的主要原因,而基本類型不行。除此之外,包裝…

從0開始學習R語言--Day30--函數型分析

在研究離散變量之間的影響時,我們往往只能獲取類似中位數,平均數點來額外數據特點;但如果數據本身具有時間特性的話,我們可以嘗試運用函數型分析,將靜態的離散點轉為動態過程來分析,即若本來是分析離散點對…

Agent輕松通-P3:分析我們的Agent

歡迎來到啾啾的博客🐱。 記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。 有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。 目錄 1 引言2 使用工具分析Agent:”日志“…

如何將FPGA設計驗證效率提升1000倍以上(1)

我們將以三個設計樣例,助力您提升設計開發效率。 對于FPGA應用開發來說,代碼是寫出來的,更是調試出來的。軟件仿真擁有最佳的信號可見性和調試靈活性,被大多數工程師熟練使用,能夠高效捕獲很多顯而易見的常見錯誤。 …