Go 如何編寫簡潔測試 -- 表格驅動測試

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。表格驅動測試是一種編寫易於擴充測試案例的測試方法。表格驅動測試在 Go 語言中很常見(並非唯一),以至於很多標準庫<sup>[1](#reference)</sup>都有使用。表格驅動測試使用匿名結構體。在這篇文章中我會告訴你如何編寫表格驅動測試。繼續使用 [errline repo](https://github.com/virup/errline) 這個項目,現在我們來為 `Wrap()` 函數添加測試。`Wrap()` 函數用於給一個 `error` 在調用位置添加檔案名稱和行數的修飾。我們尤其需要測試其中計算檔案的簡短名稱的邏輯(以粗體表示部分)。最初的 `Wrap()` 函數如下:<pre>func Wrap(err error) error { if err == nil { return nil } // If error already has file line do not add it again. if _, ok := err.(*withFileLine); ok { return err } _, file, line, ok := runtime.Caller(calldepth) if !ok { file = "???" line = 0 } <b>short := file for i := len(file) - 1; i > 0; i-- { if file[i] == '/' { short = file[i+1:] break } } file = short</b> return &withFileLine{err, file, line}}</pre>為了測試短檔案名稱計算的邏輯更加簡便,我們將這部分邏輯提取出來作為函數 `getShortFilename()`。代碼現在變成這樣:<pre>func Wrap(err error) error { if err == nil { return nil } // If error already has file line do not add it again. if _, ok := err.(*withFileLine); ok { return err } _, file, line, ok := runtime.Caller(calldepth) if !ok { file = "???" line = 0 } file = getShortFilename(file) return &withFileLine{err, file, line}}func <b>getShortFilename(file string)</b> string { short := file for i := len(file) - 1; i > 0; i-- { if file[i] == '/' { short = file[i+1:] break } } file = short return file}</pre>通過重構代碼使其便於測試是很常見的做法。我們現在通過傳遞多個檔案名稱參數來測試 `getShortFilename()`,驗證其輸出結果是否符合預期。我們先從一個空的測試函數開始:```gofunc TestShortFilename(t *testing.T) {}```緊接著,我們引入一個包含欄位 `in` 和 `expected` 的匿名結構體(struct)。`in` 表示傳遞給 `getShortFilename()` 的參數,`expected` 則代表我們預期的返回結果。`tests` 是包含多個這樣結構體的一個數組。```gofunc TestShortFilename(t *testing.T) { tests := []struct { in string // input expected string // expected result }{ {"???", "???"}, {"filename.go", "filename.go"}, {"hello/filename.go", "filename.go"}, {"main/hello/filename.go", "filename.go"}, }}```有了這個,我們就能通過迴圈來實現我們的測試方法。```gofunc TestShortFilename(t *testing.T) { tests := []struct { in string expected string }{ {"???", "???"}, {"filename.go", "filename.go"}, {"hello/filename.go", "filename.go"}, {"main/hello/filename.go", "filename.go"}, } for _, tt := range tests { actual := getShortFilename(tt.in) if strings.Compare(actual, tt.expected) != 0 { t.Fail() } }}```可以注意到,添加測試案例極其簡單,只需在 `tests` 中添加項目即可。這個方案可以擴充以適應於測試接受和返回多個參數的方法。就這樣了。代碼可以從 [我的 github](https://github.com/virup/errline/tree/master) 擷取。## <p id="reference">引用</p>1. 一些 Go 語言標準庫的表格驅動測試例子 * [https://github.com/golang/go/blob/master/src/strconv/ftoa_test.go](https://github.com/golang/go/blob/master/src/strconv/ftoa_test.go) * [https://github.com/golang/go/blob/master/src/path/match_test.go](https://github.com/golang/go/blob/master/src/path/match_test.go) * [https://github.com/golang/go/blob/master/src/archive/tar/strconv_test.go](https://github.com/golang/go/blob/master/src/archive/tar/strconv_test.go)

via: https://medium.com/@virup/how-to-write-concise-tests-table-driven-tests-ed672c502ae4

作者:Viru 譯者:alfred-zhong 校對:polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

407 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.