Go語言單元測試


Go語言似乎是個偏執狂,犧牲了不必要的靈活性,帶來一些強制的編程風格和約定。比如:

  1. 無任何形式的Makefile,模塊就是目錄、包就是目錄、編譯配制就是目錄!
  2. 不光目錄被用上了,文件名還能指定用途。文件名后綴為_test.go的都是單元測試文件,_linux32.go就是32位linux特定的代碼。
  3. 不光文件名被用上了,函數名還有特定用途。在單元測試文件中,測試函數以Test開頭。以大寫字母開頭的變量、類型和函數是外部可見的,小寫字母開頭的變量、類型和函數是外部不可見的。

類似的約定也不好說是go語言首創,在一些文件格式中也有類似規范。但是我暫時不知道到有什么其它編程語言對編程風格這么帶強制性。

對於單元測試,假設有如下calc.go文件:

package calc

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

func Max(a,b int) (ret int) {
    ret =
     if b > a { 
        ret =
    }   
     return
}

func Min(a,b int) (ret int) {
    ret =
     if b < a { 
        ret =
    }   
     return
}
有如下測試代碼calc_test.go:

 

package calc

import (
     "testing"
)
type calcTest struct {
    a,b,ret int
}

var addTests = []calcTest{
    calcTest{ 4, 6, 10},
    calcTest{ 5, 6, 11},
    calcTest{ 8, - 10, - 2},
}

func TestAdd(t *testing.T) {
     for _,v : = range addTests {
        ret : = Add(v.a,v.b)
         if ret != v.ret {
            t.Errorf( "%d add %d,want %d,but get %d",v.a,v.b,v.ret,ret)
        }
    }

}

func TestMax(t *testing.T){
    a,b : = 100, 300
    ret : = Max(a,b)
     if ret != b {
        t.Errorf( "%d is bigger than %d",b,a)
    }
}

func TestMin(t *testing.T) {
    a,b : = 100, 300
    ret : = Min(a,b)
     if ret != a {
        t.Errorf( "%d is smaller than %d",a,b)
    }
}
執行go test 得到如下結果:
PASS
ok      _ /home /liangdi /Desktop /test /go /testing     0. 008
在calc.go中設計一個邏輯錯誤,把 func Min(a,b int) ret int 改為:
func Min(a,b int) (ret int) {
    ret =
     //邏輯錯誤
     if b > a { 
        ret =
    }   
     return
}
執行go test的結果為:
-- - FAIL : TestMin ( 0.00 seconds)
    calc_test.go : 38 : 100 is smaller than 300
FAIL
exit status 1
FAIL    _ /home /liangdi /Desktop /test /go /testing     0. 005s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM