- Go語言精進之路:從新手到高手的編程思想、方法和技巧(2)
- 白明
- 578字
- 2022-01-04 17:42:21
42.3 表驅動測試的優點
表驅動測試本身是編程語言無關的。Go核心團隊和Go早期開發者在實踐過程中發現表驅動測試十分適合Go代碼測試并在標準庫和第三方項目中大量使用此種測試設計,這樣表驅動測試也就逐漸成為Go的一個慣用法。就像我們從上面的示例中看到的那樣,表驅動測試有著諸多優點。
(1)簡單和緊湊
從上面的示例中我們看到,表驅動測試將不同測試項經由被測目標執行后的實際輸出結果與預期結果的差異判斷邏輯合并為一個,這使得測試函數邏輯結構更簡單和緊湊。這種簡單和緊湊意味著測試代碼更容易被開發者理解,因此在測試代碼的生命周期內,基于表驅動的測試代碼的可維護性更好。
(2)數據即測試
表驅動測試的實質是數據驅動的測試,擴展輸入數據集即擴展測試。通過擴展數據集,我們可以很容易地實現提高被測目標測試覆蓋率的目的。
(3)結合子測試后,可單獨運行某個數據項的測試
我們將表驅動測試與子測試(subtest)結合來改造一下上面的strings_test示例:
// chapter8/sources/table_driven_strings_with_subtest_test.go func TestCompare(t *testing.T) { compareTests := []struct { name, a, b string i int }{ {`compareTwoEmptyString`, "", "", 0}, {`compareSecondParamIsEmpty`, "a", "", 1}, {`compareFirstParamIsEmpty`, "", "a", -1}, } for _, tt := range compareTests { t.Run(tt.name, func(t *testing.T) { 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) } }) } }
在示例中,我們將測試結果的判定邏輯放入一個單獨的子測試中,這樣可以單獨執行表中某項數據的測試。比如:我們單獨執行表中第一個數據項對應的測試:
$go test -v -run /TwoEmptyString table_driven_strings_with_subtest_test.go === RUN TestCompare === RUN TestCompare/compareTwoEmptyString --- PASS: TestCompare (0.00s) --- PASS: TestCompare/compareTwoEmptyString (0.00s) PASS ok command-line-arguments 0.005s
綜上,建議在編寫Go測試代碼時優先編寫基于表驅動的測試。