單元測試 Convey

1711293058發表於2020-04-08

單元測試在保證我程式碼健壯性的同時也為程式設計帶來了一些樂趣(由於正負反饋,讓簡單的寫程式碼變成了積極的互動)。在選擇go裡面的測試工具的時候,沒有找到類似php中Phpunit一樣靈活強大框架有點小失落,看到大家都在用Convey,我也試試。
對於一個新手來說,不瞭解它的話也許會掉進下面這個坑裡面去,Convey莫名其妙的執行了兩次。我就兩次掉進去,現在一定要記錄下來,防止再次犯錯。
首選來看一下這一段”一本正經”的程式碼,按照期望兩個測試用例都會通過(多麼完美的計劃啊)

func TestConvey1(t *testing.T) {

    var n = 0
//先設定一個頂層的測試塊,記得第二個引數一定是testing.T
    Convey("熟悉一下convey", t, func() {
//記錄當前函式執行的次數
        n++
        t.Log("執行了" + strconv.Itoa(n) + "次")
//然後在測試塊中寫兩個測試用例
        Convey("測試1", func() {
            So(1, ShouldEqual, 1)
        })

        Convey("測試2", func() {
            So(2, ShouldEqual, 2)
        })
    })
}

執行結果

單元測試Convey

果然測試用例全部通過,但是!but!輸出了執行1了次,緊接著又輸出了執行了2次,這就不對了吧。應該只會輸出一次的呀!

然後再看看另外一種寫法

func TestConvey2(t *testing.T) {

    var n = 0

    Convey("熟悉一下convey", t, func() {
        n++
        t.Log("執行了" + strconv.Itoa(n) + "次")

        Convey("測試1", func() {
            So(1, ShouldEqual, 1)

            Convey("測試2", func() {
                So(2, ShouldEqual, 2)
            })
        })

    })
}

執行結果

單元測試Convey

這個結果才是我要的。那麼對比兩次的寫法,Convey函式如果並列的話,會執行多次,一般這會對測試結果產生影響。要像第二種寫法一樣,層層包裹才能正常執行

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章