Go語言test之類方法測試
Go語言提供了完善的單元測試支持,開發人員可以方便的編寫測試代碼,保證自己代碼的質量。在目前的例子中,一般看到都是普通函數的例子。下面我將通過類方法的單元測試例子來展示一下Go語言的魅力。
首先是代碼所在的文件xml.go:
package myxml
import (
"encoding/xml"
)
type XMLRsq struct {
XMLName xml.Name `xml:"response"`
ResCode string `xml:"res_code"`
ResMessage string `xml:"res_message"`
}
func (r *XMLRsq ) ToString() (string, error) {
b, err := r.ToBytes()
return string(b), err
}
func (r *XMLRsq ) ToBytes() ([]byte, error) {
b, err := xml.Marshal(r)
if err != nil {
return b, err
}
b = append([]byte(xml.Header), b...)
return b, err
}
func (r *XMLRsq ) Parse(b []byte) error {
return xml.Unmarshal(b, r)
}
接著編寫單元測試代碼,注意單元測試代碼應和被測試的代碼在同一個包,且應使用xxx_test.go的規則來命名測試代碼所在的文件,例如對上面的代碼文件,應將測試文件命名為xml_test.go,包括以下的代碼:
package myxml
import "fmt"
import "encoding/xml"
import "testing"
func Test_XMLRsp_ToString(t *testing.T) {
in := XMLRsp{xml.Name{Space: "", Local: "XMLRsp"}, "1", "1", "1"}
out := []byte(xml.Header)
out = append(out, []byte(`<XMLRsp><res_code>1</res_code><res_message>1</res_message><can_use>1</can_use></XMLRsp>`)...)
r := in
b, _ := r.ToString()
if b != string(out) {
t.Errorf("XMLRsp_ToString failed, result is: [%s]\n", b)
fmt.Printf("Expectation is: [%s]\n", out)
} else {
fmt.Printf("XMLRsp_ToString result is: [%s]\n", b)
}
}
func Test_XMLRsp_Parse(t *testing.T) {
in := []byte(`<XMLRsp><res_code>1</res_code><res_message>1</res_message><can_use>1</can_use></XMLRsp>`)
out := XMLRsp{xml.Name{Space: "", Local: "XMLRsp"}, "1", "1", "1"}
r := new(XMLRsp)
_ = r.Parse(in)
if *r != out {
t.Errorf("XMLRsp_Parse failed, result is: [%s]\n", *r)
fmt.Printf("Expectation is: [%s]\n", out)
} else {
fmt.Printf("XMLRsp_Parse result is: [%s]\n", *r)
}
}
測試代碼中,函數可以用如下方式命名:Test_T_M,其中T為類型名,M為方法名,這樣容易區分,但這不是Go語言的強制要求。
具體測試代碼里先構造了一個類XMLRsp的對象,然后通過它去調用相應的類方法,本質上與其他單元測試代碼并無不同。
上面測試代碼第15行,先用了一個類型轉換string(out)來得到一個string類型的out表示,因為Go語言里slice之間不能直接比較。
XMLRsp類的3個方法中,ToString的執行路徑已經覆蓋了ToBytes,故未單獨編寫用例。
運行go test命令,可以得到類似如下的結果:
XMLRsp_ToString result is: [<?xml version="1.0" encoding="UTF-8"?> <XMLRsp><res_code>1</res_code><res_message>1</res_message><can_use>1</can_use></XMLRsp>] XMLRsp_Parse result is: [{{ XMLRsp} 1 1 1}] PASS ok myxml 1.016s
表示這次測試的結果為PASS,大功告成,你可以忙著寫其他的代碼去了^-^
浙公網安備 33010602011771號