官术网_书友最值得收藏!

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測試代碼時優先編寫基于表驅動的測試。

主站蜘蛛池模板: 渝北区| 澎湖县| 汾西县| 承德市| 兴安县| 肥东县| 社旗县| 茌平县| 和硕县| 林周县| 内黄县| 花莲市| 临汾市| 清涧县| 宁强县| 海伦市| 额敏县| 广昌县| 汕尾市| 天气| 青冈县| 莒南县| 天等县| 巴彦淖尔市| 唐海县| 镇远县| 万全县| 漯河市| 遂昌县| 富蕴县| 抚顺县| 修文县| 江川县| 永寿县| 子长县| 朝阳县| 固阳县| 石河子市| 天水市| 遂溪县| 腾冲县|