Go測試之.golden文件使用示例詳解
Go測試中的.golden 文件是干什么用的?
舉例說明
在Go語言中,.golden
文件通常用于測試中的黃金文件(golden files)。黃金文件是在測試期間記錄預期輸出結果的文件。測試用例運行時,黃金文件用于比較實際輸出與預期輸出是否一致。
通常,".golden" 文件的命名規(guī)則是將測試文件的名稱與 ".golden" 后綴相結合,例如,如果測試文件為 "foo_test.go",則相應的 ".golden" 文件可能被命名為 "foo_test.golden"。
在測試期間,如果測試輸出與 ".golden" 文件的內容匹配,則測試被認為是通過的。否則,測試將失敗并顯示差異信息,以幫助開發(fā)人員確定測試失敗的原因。
需要注意的是,".golden" 文件不應該包含敏感信息,因為這些文件通常被包含在源代碼倉庫中,并且可能會被共享或分發(fā)給其他人。
".golden" 文件的命名并沒有一個官方規(guī)定的標準,但是根據一些 Go 語言社區(qū)的約定,".golden" 文件通常被命名為 ".golden" 是因為這個后綴在文件名中很不常見,因此可以很容易地與其他文件進行區(qū)分。
此外,一些人認為 ".golden" 這個名稱的來源可能與軟件測試中的“黃金數據”(Golden Data)有關。在軟件測試中,“黃金數據”指的是已知正確的數據,用于驗證軟件是否按照預期運行。因此,將測試期望輸出與已知正確的數據進行比較,與軟件測試中使用的“黃金數據”進行比較是相似的。這種類比可能也是 ".golden" 文件名稱的一個來源。
舉個例子,假設你正在編寫一個函數來格式化一個字符串,并且你想要編寫相應的測試用例。你可以創(chuàng)建一個黃金文件來保存預期的輸出結果。在測試運行時,測試代碼將生成實際的輸出結果并將其與黃金文件中的預期結果進行比較。如果實際輸出與預期輸出匹配,測試將被標記為通過。如果不匹配,測試將被標記為失敗,以便你可以檢查代碼的更改是否是有意的。
示例
假設你有一個名為formatter.go
的文件,其中包含一個FormatString
函數用于格式化字符串。你還有一個測試文件formatter_test.go
,其中包含一個測試用例來測試FormatString
函數。
在測試文件中,你可以創(chuàng)建一個黃金文件expected_output.golden
,其中包含你期望的輸出結果。然后,你的測試用例可以讀取這個黃金文件,調用FormatString
函數,生成實際的輸出,并將其與黃金文件中的預期結果進行比較。
// 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) } }
在這個例子中,測試代碼讀取expected_output.golden
文件,它的內容可以是Formatted: Hello, World!
。然后,測試用例調用FormatString
函數并將其輸出與黃金文件中的預期結果進行比較。如果兩者不匹配,測試將失敗并輸出相應的錯誤消息。
使用黃金文件可以有效地驗證代碼的輸出是否與預期一致,并提供了一種可持續(xù)的方式來更新測試結果。如果你對FormatString
函數進行了更改,你只需驗證黃金文件是否需要相應地更新,而無需手動更新所有測試用例的預期輸出。
測試
# command-line-arguments [command-line-arguments.test] ./formatter_test.go:15:18: undefined: FormatString
需要對 運行/調試設置做如下修改
同時需要先執(zhí)行 go mod init golden 和 go mod tidy,否則上圖會提示 錯誤: 找不到軟件包 golden
新建 expected_output.golden,如果什么內容也不寫入,執(zhí)行單測:
即 需要將預期的內容寫到expected_output.golden中,最后會做一個比較
和斷言有何區(qū)別?
".golden" 文件和斷言是測試中兩個不同的概念,它們有一些相似之處,但也有一些區(qū)別。
斷言是在測試代碼中使用的一種機制,用于檢查代碼的行為是否符合預期。測試代碼中通常會使用斷言來檢查一些條件是否為真,如果條件不滿足,則測試將失敗。例如,在 Go 語言中,可以使用 assert
包中的 Equal
函數來檢查兩個值是否相等。
與斷言不同,".golden" 文件通常用于測試輸出或結果是否與預期的輸出或結果匹配。測試代碼會生成一些輸出或結果,然后與預期的輸出或結果進行比較,如果匹配,則測試通過,否則將測試失敗。".golden" 文件是預期輸出或結果的一種形式,測試代碼會將其與實際輸出或結果進行比較,以確定測試是否通過。
因此,斷言和".golden" 文件是測試中兩種不同的機制,它們用于檢查不同的測試條件。斷言通常用于檢查代碼的行為是否符合預期,而 ".golden" 文件通常用于測試輸出或結果是否與預期的輸出或結果匹配。
(其實和直接在斷言里寫預期的字符串效果類似,但寫文件,更適用于內容較多的case吧; 或者Go官方沒有提供斷言,一般的項目都使用第三方的 github.com/stretchr/testify/assert)
“黃金文件”這個概念,在其他編程語言中有嗎?
雖然 "黃金文件" 這個特定術語在其他編程語言中可能不常見,但類似的概念在其他語言和測試框架中也存在。這些概念可能被稱為 "參考文件"、"預期輸出文件"、"基準文件" 或 "固定輸出文件",具體取決于使用的語言和框架。
下面是一些示例:
- Python Unittest:在Python的unittest框架中,可以使用
assertMultiLineEqual()
方法來比較實際輸出和參考文件中的內容。參考文件可以是文本文件或其他格式的文件。 - Java JUnit:在Java的JUnit測試框架中,你可以將預期輸出作為字符串或文件提供給斷言方法,然后將實際輸出與其進行比較。這類似于使用黃金文件進行比較。
- C++ Catch2:Catch2是一個流行的C++測試框架。你可以使用
REQUIRE_THAT()
或其他類似的宏來比較實際輸出與預期輸出。在這種情況下,預期輸出可以是一個字符串或文件。
盡管不同的編程語言和測試框架可能使用不同的術語,但它們都提供了一種機制來驗證實際輸出與預期輸出之間的一致性。這種機制有助于確保代碼的行為符合預期,并提供一種可持續(xù)的方式來更新測試結果。
以上就是Go測試之.golden文件使用示例詳解的詳細內容,更多關于Go .golden測試文件的資料請關注腳本之家其它相關文章!
相關文章
使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟
Go語言是采用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發(fā),大家可以根據自己的喜好自行選擇,下面這篇文章主要給大家介紹了關于使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟,需要的朋友可以參考下2022-11-11Golang 實現 Redis系列(六)如何實現 pipeline 模式的 redis 客戶端
pipeline 模式的 redis 客戶端需要有兩個后臺協(xié)程負責 tcp 通信,調用方通過 channel 向后臺協(xié)程發(fā)送指令,并阻塞等待直到收到響應,本文是使用 golang 實現 redis 系列的第六篇, 將介紹如何實現一個 Pipeline 模式的 Redis 客戶端。2021-07-07