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


免責聲明!

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



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