- Go語言精進之路:從新手到高手的編程思想、方法和技巧(2)
- 白明
- 516字
- 2022-01-04 17:42:20
42.2 表驅動的測試實踐
Go測試代碼的邏輯十分簡單,約束也甚少,但我們發現:上面僅有三組預置輸入數據的示例的測試代碼已顯得十分冗長,如果為測試預置的數據組數增多,測試函數本身就將變得十分龐大。并且,我們看到上述示例的測試邏輯中存在很多重復的代碼,顯得十分煩瑣。我們來嘗試對上述示例做一些改進:
// chapter8/sources/table_driven_strings_test.go func TestCompare(t *testing.T) { compareTests := []struct { a, b string i int }{ {"", "", 0}, {"a", "", 1}, {"", "a", -1}, } for _, tt := range compareTests { cmp := strings.Compare(tt.a, tt.b) if cmp != tt.i { t.Errorf(`want %v, but Compare(%q, %q) = %v`, tt.i, tt.a, tt.b, cmp) } } }
在上面這個改進的示例中,我們將之前示例中重復的測試邏輯合并為一個,并將預置的輸入數據放入一個自定義結構體類型的切片中。這個示例的長度看似并沒有比之前的實例縮減多少,但它卻是一個可擴展的測試設計。如果增加輸入測試數據的組數,就像下面這樣:
// chapter8/sources/table_driven_strings_more_cases_test.go func TestCompare(t *testing.T) { compareTests := []struct { a, b string i int }{ {"", "", 0}, {"a", "", 1}, {"", "a", -1}, {"abc", "abc", 0}, {"ab", "abc", -1}, {"abc", "ab", 1}, {"x", "ab", 1}, {"ab", "x", -1}, {"x", "a", 1}, {"b", "x", -1}, {"abcdefgh", "abcdefgh", 0}, {"abcdefghi", "abcdefghi", 0}, {"abcdefghi", "abcdefghj", -1}, } for _, tt := range compareTests { cmp := strings.Compare(tt.a, tt.b) if cmp != tt.i { t.Errorf(`want %v, but Compare(%q, %q) = %v`, tt.i, tt.a, tt.b, cmp) } } }
可以看到,無須改動后面的測試邏輯,只需在切片中增加數據條目即可。在這種測試設計中,這個自定義結構體類型的切片(上述示例中的compareTests)就是一個表(自定義結構體類型的字段就是列),而基于這個數據表的測試設計和實現則被稱為“表驅動的測試”。
推薦閱讀
- 精通Nginx(第2版)
- DevOps入門與實踐
- Network Automation Cookbook
- Visual C++串口通信技術詳解(第2版)
- Kali Linux Wireless Penetration Testing Beginner's Guide(Third Edition)
- MATLAB 2020從入門到精通
- Getting Started with Gulp
- Visual Basic程序設計上機實驗教程
- 基于ARM Cortex-M4F內核的MSP432 MCU開發實踐
- C#程序設計(項目教學版)
- 深度學習入門:基于Python的理論與實現
- Web開發新體驗
- Moodle 3.x Developer's Guide
- Visual C++程序開發范例寶典
- 谷歌JAX深度學習從零開始學