Go測(cè)試之.golden文件使用示例詳解
Go測(cè)試中的.golden 文件是干什么用的?
舉例說明
在Go語言中,.golden
文件通常用于測(cè)試中的黃金文件(golden files)。黃金文件是在測(cè)試期間記錄預(yù)期輸出結(jié)果的文件。測(cè)試用例運(yùn)行時(shí),黃金文件用于比較實(shí)際輸出與預(yù)期輸出是否一致。
通常,".golden" 文件的命名規(guī)則是將測(cè)試文件的名稱與 ".golden" 后綴相結(jié)合,例如,如果測(cè)試文件為 "foo_test.go",則相應(yīng)的 ".golden" 文件可能被命名為 "foo_test.golden"。
在測(cè)試期間,如果測(cè)試輸出與 ".golden" 文件的內(nèi)容匹配,則測(cè)試被認(rèn)為是通過的。否則,測(cè)試將失敗并顯示差異信息,以幫助開發(fā)人員確定測(cè)試失敗的原因。
需要注意的是,".golden" 文件不應(yīng)該包含敏感信息,因?yàn)檫@些文件通常被包含在源代碼倉庫中,并且可能會(huì)被共享或分發(fā)給其他人。
".golden" 文件的命名并沒有一個(gè)官方規(guī)定的標(biāo)準(zhǔn),但是根據(jù)一些 Go 語言社區(qū)的約定,".golden" 文件通常被命名為 ".golden" 是因?yàn)檫@個(gè)后綴在文件名中很不常見,因此可以很容易地與其他文件進(jìn)行區(qū)分。
此外,一些人認(rèn)為 ".golden" 這個(gè)名稱的來源可能與軟件測(cè)試中的“黃金數(shù)據(jù)”(Golden Data)有關(guān)。在軟件測(cè)試中,“黃金數(shù)據(jù)”指的是已知正確的數(shù)據(jù),用于驗(yàn)證軟件是否按照預(yù)期運(yùn)行。因此,將測(cè)試期望輸出與已知正確的數(shù)據(jù)進(jìn)行比較,與軟件測(cè)試中使用的“黃金數(shù)據(jù)”進(jìn)行比較是相似的。這種類比可能也是 ".golden" 文件名稱的一個(gè)來源。
舉個(gè)例子,假設(shè)你正在編寫一個(gè)函數(shù)來格式化一個(gè)字符串,并且你想要編寫相應(yīng)的測(cè)試用例。你可以創(chuàng)建一個(gè)黃金文件來保存預(yù)期的輸出結(jié)果。在測(cè)試運(yùn)行時(shí),測(cè)試代碼將生成實(shí)際的輸出結(jié)果并將其與黃金文件中的預(yù)期結(jié)果進(jìn)行比較。如果實(shí)際輸出與預(yù)期輸出匹配,測(cè)試將被標(biāo)記為通過。如果不匹配,測(cè)試將被標(biāo)記為失敗,以便你可以檢查代碼的更改是否是有意的。
示例
假設(shè)你有一個(gè)名為formatter.go
的文件,其中包含一個(gè)FormatString
函數(shù)用于格式化字符串。你還有一個(gè)測(cè)試文件formatter_test.go
,其中包含一個(gè)測(cè)試用例來測(cè)試FormatString
函數(shù)。
在測(cè)試文件中,你可以創(chuàng)建一個(gè)黃金文件expected_output.golden
,其中包含你期望的輸出結(jié)果。然后,你的測(cè)試用例可以讀取這個(gè)黃金文件,調(diào)用FormatString
函數(shù),生成實(shí)際的輸出,并將其與黃金文件中的預(yù)期結(jié)果進(jìn)行比較。
// formatter.go package main import "fmt" func FormatString(s string) string { return fmt.Sprintf("Formatted: %s", s) } // formatter_test.go package main import ( "io/ioutil" "testing" ) func TestFormatString(t *testing.T) { input := "Hello, World!" expectedOutput, err := ioutil.ReadFile("expected_output.golden") if err != nil { t.Fatalf("Failed to read golden file: %v", err) } actualOutput := FormatString(input) if string(actualOutput) != string(expectedOutput) { t.Errorf("Unexpected output:\nExpected: %s\nActual: %s", expectedOutput, actualOutput) } }
在這個(gè)例子中,測(cè)試代碼讀取expected_output.golden
文件,它的內(nèi)容可以是Formatted: Hello, World!
。然后,測(cè)試用例調(diào)用FormatString
函數(shù)并將其輸出與黃金文件中的預(yù)期結(jié)果進(jìn)行比較。如果兩者不匹配,測(cè)試將失敗并輸出相應(yīng)的錯(cuò)誤消息。
使用黃金文件可以有效地驗(yàn)證代碼的輸出是否與預(yù)期一致,并提供了一種可持續(xù)的方式來更新測(cè)試結(jié)果。如果你對(duì)FormatString
函數(shù)進(jìn)行了更改,你只需驗(yàn)證黃金文件是否需要相應(yīng)地更新,而無需手動(dòng)更新所有測(cè)試用例的預(yù)期輸出。
測(cè)試
# command-line-arguments [command-line-arguments.test] ./formatter_test.go:15:18: undefined: FormatString
需要對(duì) 運(yùn)行/調(diào)試設(shè)置做如下修改
同時(shí)需要先執(zhí)行 go mod init golden 和 go mod tidy,否則上圖會(huì)提示 錯(cuò)誤: 找不到軟件包 golden
新建 expected_output.golden,如果什么內(nèi)容也不寫入,執(zhí)行單測(cè):
即 需要將預(yù)期的內(nèi)容寫到expected_output.golden中,最后會(huì)做一個(gè)比較
和斷言有何區(qū)別?
".golden" 文件和斷言是測(cè)試中兩個(gè)不同的概念,它們有一些相似之處,但也有一些區(qū)別。
斷言是在測(cè)試代碼中使用的一種機(jī)制,用于檢查代碼的行為是否符合預(yù)期。測(cè)試代碼中通常會(huì)使用斷言來檢查一些條件是否為真,如果條件不滿足,則測(cè)試將失敗。例如,在 Go 語言中,可以使用 assert
包中的 Equal
函數(shù)來檢查兩個(gè)值是否相等。
與斷言不同,".golden" 文件通常用于測(cè)試輸出或結(jié)果是否與預(yù)期的輸出或結(jié)果匹配。測(cè)試代碼會(huì)生成一些輸出或結(jié)果,然后與預(yù)期的輸出或結(jié)果進(jìn)行比較,如果匹配,則測(cè)試通過,否則將測(cè)試失敗。".golden" 文件是預(yù)期輸出或結(jié)果的一種形式,測(cè)試代碼會(huì)將其與實(shí)際輸出或結(jié)果進(jìn)行比較,以確定測(cè)試是否通過。
因此,斷言和".golden" 文件是測(cè)試中兩種不同的機(jī)制,它們用于檢查不同的測(cè)試條件。斷言通常用于檢查代碼的行為是否符合預(yù)期,而 ".golden" 文件通常用于測(cè)試輸出或結(jié)果是否與預(yù)期的輸出或結(jié)果匹配。
(其實(shí)和直接在斷言里寫預(yù)期的字符串效果類似,但寫文件,更適用于內(nèi)容較多的case吧; 或者Go官方?jīng)]有提供斷言,一般的項(xiàng)目都使用第三方的 github.com/stretchr/testify/assert)
“黃金文件”這個(gè)概念,在其他編程語言中有嗎?
雖然 "黃金文件" 這個(gè)特定術(shù)語在其他編程語言中可能不常見,但類似的概念在其他語言和測(cè)試框架中也存在。這些概念可能被稱為 "參考文件"、"預(yù)期輸出文件"、"基準(zhǔn)文件" 或 "固定輸出文件",具體取決于使用的語言和框架。
下面是一些示例:
- Python Unittest:在Python的unittest框架中,可以使用
assertMultiLineEqual()
方法來比較實(shí)際輸出和參考文件中的內(nèi)容。參考文件可以是文本文件或其他格式的文件。 - Java JUnit:在Java的JUnit測(cè)試框架中,你可以將預(yù)期輸出作為字符串或文件提供給斷言方法,然后將實(shí)際輸出與其進(jìn)行比較。這類似于使用黃金文件進(jìn)行比較。
- C++ Catch2:Catch2是一個(gè)流行的C++測(cè)試框架。你可以使用
REQUIRE_THAT()
或其他類似的宏來比較實(shí)際輸出與預(yù)期輸出。在這種情況下,預(yù)期輸出可以是一個(gè)字符串或文件。
盡管不同的編程語言和測(cè)試框架可能使用不同的術(shù)語,但它們都提供了一種機(jī)制來驗(yàn)證實(shí)際輸出與預(yù)期輸出之間的一致性。這種機(jī)制有助于確保代碼的行為符合預(yù)期,并提供一種可持續(xù)的方式來更新測(cè)試結(jié)果。
以上就是Go測(cè)試之.golden文件使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go .golden測(cè)試文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟
Go語言是采用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發(fā),大家可以根據(jù)自己的喜好自行選擇,下面這篇文章主要給大家介紹了關(guān)于使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟,需要的朋友可以參考下2022-11-11Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開發(fā)過程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03詳解go程序如何在windows服務(wù)中開啟和關(guān)閉
這篇文章主要介紹了一個(gè)go程序,如何在windows服務(wù)中優(yōu)雅開啟和關(guān)閉,文中通過代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07Golang 實(shí)現(xiàn) Redis系列(六)如何實(shí)現(xiàn) pipeline 模式的 redis 客戶端
pipeline 模式的 redis 客戶端需要有兩個(gè)后臺(tái)協(xié)程負(fù)責(zé) tcp 通信,調(diào)用方通過 channel 向后臺(tái)協(xié)程發(fā)送指令,并阻塞等待直到收到響應(yīng),本文是使用 golang 實(shí)現(xiàn) redis 系列的第六篇, 將介紹如何實(shí)現(xiàn)一個(gè) Pipeline 模式的 Redis 客戶端。2021-07-07golang使用RSA加密和解密的實(shí)現(xiàn)示例
在Golang中RSA加密和解密是一個(gè)常見的操作,本文主要介紹了golang使用RSA加密和解密的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03Go語言實(shí)現(xiàn)棧與隊(duì)列基本操作學(xué)家
go語言中,并沒有棧與隊(duì)列相關(guān)的數(shù)據(jù)結(jié)構(gòu),但是我們可以借助切片來實(shí)現(xiàn)棧與隊(duì)列的操作;接下來我們一起實(shí)現(xiàn)棧與隊(duì)列基本操作,感興趣的可以了解一下2022-11-11