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,大功告成,你可以忙着寫其他的代碼去了^-^