天天看點

ginkgo 測試入門

簡介

Ginkgo是一個BDD風格的Go測試架構,旨在幫助您有效地編寫富有表現力的綜合測試。

安裝

$ go get github.com/onsi/ginkgo/ginkgo
$ go get github.com/onsi/gomega/...      

ginkgo入門測試

$ go env |grep -i gopath
GOPATH="/usr/local/gopath"

$ cd /usr/local/gopath/src
$ mkdir books
$ cd books
$ ginkgo bootstrap
$ ls 
books_suite_test.go
$ cat books_suite_test.go

package books_test

import (
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
    "testing"
)

func TestBooks(t *testing.T) {
    RegisterFailHandler(Fail)
    RunSpecs(t, "Books Suite")
}

$ vim books.go
package books

type Book struct {
    Title  string
    Author string
    Pages  int
}

func (b *Book) CategoryByLength() string {

    if b.Pages >= 300 {
        return "NOVEL"
    }

    return "SHORT STORY"
}

$ ginkgo 
Failed to compile books:

go: cannot find main module; see 'go help modules'

Ginkgo ran 1 suite in 53.915004ms
Test Suite Failed

$ go mod init
go: creating new go.mod: module books


$ ginkgo 
Running Suite: Books Suite
==========================
Random Seed: 1595924522
Will run 0 of 0 specs


Ran 0 of 0 Specs in 0.000 seconds
SUCCESS! -- 0 Passed | 0 Failed | 0 Pending | 0 Skipped
PASS

Ginkgo ran 1 suite in 1.028037658s
Test Suite Passed      

分析:

  • Go允許我們在books包同目錄下指定books_test包。使用books_test而不是books可以讓我們不破壞books包的封裝:你的測試需要導入books包并從外部通路它,就像導入其它任何包一樣。這是進入包,測試其内部結構并進行更多行為測試的首選。當然,您可以選擇不使用此功能- 隻需把package books_test改為package books即可。
  • 通過.将ginkgo和gomega包導入了測試的頂級命名空間
  • TestBooks是一個testing測試。當您運作go test或ginkgo指令時,Go測試運作器将運作此功能。
  • RegisterFailHandler(Fail): Ginkgo 測試通過調用Fail(description string)功能來表示失敗。我們使用RegisterFailHandler将此函數傳遞給Gomega。這是Ginkgo和Gomega之間的唯一連接配接點。
  • RunSpecs(t *testing.T, suiteDescription string)通知Ginkgo啟動測試套件。如果您的任何specs失敗,Ginkgo将自動使testing.T失敗。

給套件添加Specs

一個空的測試套件不是很有趣。雖然您可以開始直接将測試添加到books_suite_test.go中,但您可能更願意将測試分成單獨的檔案(特别是對于包含多個檔案的包)。讓我們為book.go模型添加一個測試檔案:

$ ginkgo generate book
Generating ginkgo test for Book in:
  book_test.go
  
$ cat book_test.go
package books_test

import (
  . "github.com/onsi/ginkgo"
  . "github.com/onsi/gomega"

  "books"
)

var _ = Describe("Book", func() {

})      

分析:

  • ginkgo和gomega包導入頂級命名空間
  • 我們導入books包,因為我們使用特殊的books_test包來将我們的測試與我們的代碼隔離開來。
  • 友善起見,我們将books包導入命名空間
  • 使用Ginkgo的Describe(text string, body func()) bool函數添加了頂級Describe容器。
  • var _ = … 技巧允許我們在頂級評估Describe,而不必将其包裝在func init() {}

Describe 中的功能将包含我們的Specs。現在讓我們添加一些來測試從JSON中加載books:

package books_test

import (
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"

    //"books"
)

type Book struct {
    Title  string
    Author string
    Pages  int
}

func (b *Book) CategoryByLength() string {

    if b.Pages >= 300 {
        return "NOVEL"
    }

    return "SHORT STORY"
}



var _ = Describe("Book", func() {
    var (
        longBook  Book
        shortBook Book
    )

    BeforeEach(func() {
        longBook = Book{
            Title:  "Les Miserables",
            Author: "Victor Hugo",
            Pages:  1488,
        }

        shortBook = Book{
            Title:  "Fox In Socks",
            Author: "Dr. Seuss",
            Pages:  24,
        }
    })

    Describe("Categorizing book length", func() {
        Context("With more than 300 pages", func() {
            It("should be a novel", func() {
                Expect(longBook.CategoryByLength()).To(Equal("NOVEL"))
            })
        })

        Context("With fewer than 300 pages", func() {
            It("should be a short story", func() {
                Expect(shortBook.CategoryByLength()).To(Equal("SHORT STORY"))
            })
        })
    })
})      
  • Ginkgo廣泛使用閉包(⚠️閉包不是私有,閉的意思不是“封閉内部狀态”,而是“封閉外部狀态”!),允許您建構描述性測試套件。
  • 您應該使用Describe和Context容器來表達性地組織代碼的行為。
  • 您應該使用Describe和Context容器來表達性地組織代碼的行為。
  • 為了在BeforeEach和It之間共享狀态,您使用閉包變量,通常在最相關的Describe或Context容器的頂部定義。
  • 我們使用Gomega的Expect文法來對CategoryByLength()方法産生期望值。
$ ginkgo 
Running Suite: Books Suite
==========================
Random Seed: 1595926303
Will run 2 of 2 specs

••
Ran 2 of 2 Specs in 0.001 seconds
SUCCESS! -- 2 Passed | 0 Failed | 0 Pending | 0 Skipped
PASS

Ginkgo ran 1 suite in 1.108253073s
Test Suite Passed