天天看點

Go語言之單元測試

一、問題引入

如果讓你測試一個函數或者子產品,你會怎麼做呢?如下:

package main

import "fmt"

// 被測試的函數
func calAdd(n1 int, n2 int) int {

    res := n1 + n2
    return res

}

func main() {
    // 傳統測試方式,在main函數中調用,看輸出結果
    res := calAdd(1, 2)
    if res != 3 {
        fmt.Printf("calAdd函數錯誤,期望值是%v,傳回值是%v", 3, res)
    } else {
        fmt.Printf("calAdd函數正确,期望值是%v,傳回值是%v", 3, res)

    }
}      

可以看到在主函數中對被測試函數進行測試,那麼會存在一些弊端:

  • 與主函數main進行了綁定
  • 一旦有多個被測試項,都要更改主函數的代碼
  • 如果項目正在運作過程中,還需要停止主函數才能繼續測試

是以就需要一個專門用于測試的架構來幫助我們解決上面的問題。

二、testing測試架構

1、什麼是testing

testing 提供對 Go 包的自動化測試的支援。通過 `go test` 指令,能夠自動執行如下形式的任何函數:

func TestXxx(*testing.T)      

其中 Xxx 可以是任何字母數字字元串(但第一個字母不能是 [a-z]),用于識别測試例程。

在這些函數中,使用 Error, Fail 或相關方法來發出失敗信号。

要編寫一個新的測試套件,需要建立一個名稱以 _test.go 結尾的檔案,該檔案包含 `TestXxx` 函數,如上所述。 将該檔案放在與被測試的包相同的包中。該檔案将被排除在正常的程式包之外,但在運作 “go test” 指令時将被包含。 有關詳細資訊,請運作 “go help test” 和 “go help testflag” 了解。

2、快速入門

  • 目錄結構
|─test
|       cal.go
|       cal_test.go      
  • cal.go 業務函數
package abc

func calAdd(n1 int, n2 int) int {

    res := n1 + n2
    return res

}      
  • cal_test.go 測試套件
package abc

import (
    "testing"
)

func TestCalAdd(t *testing.T) {
    res := calAdd(1, 2)
    if res != 3 {
        t.Fatalf("calAdd函數錯誤,期望值是%v,傳回值是%v", 3, res)
    } else {
        t.Logf("calAdd函數正确,期望值是%v,傳回值是%v", 3, res)

    }
}      

在上面的代碼中可以看到:

  • cal_test.go測試套件中并沒有引入calAdd函數,但是可以識别,原因就是将測試套件cal_test.go和與cal.go放在同一個包abc下
  • 測試套件中的測試用例必須以Test開頭,這樣友善識别具體的測試用例

3、注意事項

  • 測試套件必須以_test.go結尾
  • 測試套件中的測試用例必須以Test開頭,但後面的第一個不能是小寫字母[a-z]
  • 一個測試套件檔案中可以有多個測試用例函數

4、測試方法

進入到test檔案夾:

  • 所有測試用例
go test -v  // 執行所有的測試套件中的所有測試用例      
  • 測試單個檔案
go test -v cal_test.go cal.go      
  • 測試單個方法
go test -v -test.run TestCalAdd      

作者:iveBoy

出處:http://www.cnblogs.com/shenjianping/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接配接,否則保留追究法律責任的權利。

go