[Golang] GoConvey 測試框架使用指南

GoConvey

是一款針對 Golang 的測試框架,可以管理和運行測試用例,同時提供了豐富的斷言函數,並支持很多 Web 界面特性。

GoConvey 網站 : http://smartystreets.github.io/goconvey/

GoConvey 是個相當不錯的 Go 測試工具,支持 go test。可直接在終端窗口和瀏覽器上使用。

特點:

下面是一個能夠實現整數基本四則運算(加、減、乘、除)的代碼:

package goconvey

import (
    "errors"
)

func Add(a, b int) int {
    return a + b
}

func Subtract(a, b int) int {
    return a - b
}

func Multiply(a, b int) int {
    return a * b
}

func Division(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("被除數不能爲 0")
    }
    return a / b, nil
}

上面的代碼中,我們實現了 4 個函數,因此需要爲這 4 個函數分別書寫單元測試:

package goconvey

import (
    "testing"

    . "github.com/smartystreets/goconvey/convey"
)

func TestAdd(t *testing.T) {
    Convey("將兩數相加", t, func() {
        So(Add(1, 2), ShouldEqual, 3)
    })
}

func TestSubtract(t *testing.T) {
    Convey("將兩數相減", t, func() {
        So(Subtract(1, 2), ShouldEqual, -1)
    })
}

func TestMultiply(t *testing.T) {
    Convey("將兩數相乘", t, func() {
        So(Multiply(3, 2), ShouldEqual, 6)
    })
}

func TestDivision(t *testing.T) {
    Convey("將兩數相除", t, func() {

        Convey("除以非 0 數", func() {
            num, err := Division(10, 2)
            So(err, ShouldBeNil)
            So(num, ShouldEqual, 5)
        })

        Convey("除以 0", func() {
            _, err := Division(10, 0)
            So(err, ShouldNotBeNil)
        })
    })
}

首先,您需要使用官方推薦的方式導入 GoConvey 的輔助包以減少冗餘的代碼:. "github.com/smartystreets/goconvey/convey"

每個單元測試的名稱需要以 Test 開頭,例如:TestAdd,並需要接受一個類型爲 *testing.T 的參數。

使用 GoConvey 書寫單元測試,每個測試用例需要使用 Convey 函數包裹起來。它接受的第一個參數爲 string 類型的描述;第二個參數一般爲 *testing.T,即本例中的變量 t;第三個參數爲不接收任何參數也不返回任何值的函數(習慣以閉包的形式書寫)。

Convey 語句同樣可以無限嵌套,以體現各個測試用例之間的關係,例如 TestDivision 函數就採用了嵌套的方式體現它們之間的關係。需要注意的是,只有最外層的 Convey 需要傳入變量 t,內層的嵌套均不需要傳入。

最後,需要使用 So 語句來對條件進行判斷。在本例中,我們只使用了 3 個不同類型的條件判斷:ShouldBeNilShouldEqual 和 ShouldNotBeNil,分別表示值應該爲 nil、值應該相等和值不應該爲 nil。有關詳細的條件列表,可以參見 官方文檔

運行測試

現在,您可以打開命令行,然後輸入 go test -v 來進行測試。由於 GoConvey 兼容 Go 原生的單元測試,因此我們可以直接使用 Go 的命令來執行測試。

以下便是命令行的輸出(Mac):

=== RUN TestAdd

  將兩數相加 ✔


1 assertion thus far

--- PASS: TestAdd (0.00 seconds)
=== RUN TestSubtract

  將兩數相減 ✔


2 assertions thus far

--- PASS: TestSubtract (0.00 seconds)
=== RUN TestMultiply

  將兩數相乘 ✔


3 assertions thus far

--- PASS: TestMultiply (0.00 seconds)
=== RUN TestDivision

  將兩數相除
    除以非 0 數 ✔✔
    除以 06 assertions thus far

--- PASS: TestDivision (0.00 seconds)
PASS
ok      github.com/Unknwon/go-rock-libraries-showcases/lectures/03-goconvey/class1/sample/goconvey  0.009s

我們可以看到,輸出結果調理非常清晰,單元測試的代碼寫起來也非常優雅。那麼,這就是全部嗎?當然不是。GoConvey 不僅支持在命令行進行人工調用調試命令,還有非常舒適的 Web 界面提供給開發者來進行自動化的編譯測試工作。

Skip

針對想忽略但又不想刪掉或註釋掉某些斷言操作,GoConvey 提供了 Convey/So 的 Skip 方法:

當存在 SkipConvey 或 SkipSo 時,測試日誌中會顯式打上 "skipped" 形式的標記:

Web 界面

想要使用 GoConvey 的 Web 界面特性,需要在相應目錄下執行 goconvey(需使用 go get 安裝到 $GOPATH/bin 目錄下),然後打開瀏覽器,訪問 http://localhost:8080 ,就可以看到下以下界面:

在 Web 界面中,您可以設置界面主題,查看完整的測試結果,使用瀏覽器提醒等實用功能。

其它功能:

小結

到這裏,大家應該對如何使用 GoConvey 包來書寫測試用例有了基本的瞭解,並且也見識到了它是如何讓書寫測試用例這項枯燥的工作變得優雅,並讓人充滿樂趣。

  1. import goconvey 包時,前面加點號 ".",以減少冗餘的代碼
  2. 測試函數的名字必須以 Test 開頭,而且參數類型必須爲 * testing.T
  3. 每個測試用例必須使用 Convey 函數包裹起來,推薦使用 Convey 語句的嵌套,即一個函數有一個測試函數,測試函數中嵌套兩級 Convey 語句,第一級 Convey 語句對應測試函數,第二級 Convey 語句對應測試用例
  4. Convey 語句的第三個參數習慣以閉包的形式實現,在閉包中通過 So 語句完成斷言
  5. 使用 GoConvey 框架的 Web 界面特性,作爲命令行的補充
  6. 在適當的場景下使用 SkipConvey 函數或 SkipSo 函數
  7. 當測試中有需要時,可以定製斷言函數

如果在被測函數中調用了其他函數,可以使用以下方法

參考:
https://www.jianshu.com/p/e3b2b1194830
https://studygolang.com/articles/1513

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://www.cnblogs.com/WayneZeng/p/9290711.html