• 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]
    ", b)
            fmt.Printf("Expectation is: [%s]
    ", out)
        } else {
            fmt.Printf("XMLRsp_ToString result is: [%s]
    ", 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]
    ", *r)
            fmt.Printf("Expectation is: [%s]
    ", out)
        } else {
            fmt.Printf("XMLRsp_Parse result is: [%s]
    ", *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,大功告成,你可以忙着写其他的代码去了^-^

  • 相关阅读:
    【原创】Java与数据结构(上篇:排序算法)
    【九度OJ】题目1084:整数拆分
    kaixin001接入
    Facebook接入(下)
    svn手册摘录
    Facebook接入(上)
    使用mysqldb从数据库中导出xml
    使用cmd模块,让脚本更舒服些
    django 的简单测试
    python字符串替换
  • 原文地址:https://www.cnblogs.com/technic-emotion/p/3665826.html
Copyright © 2020-2023  润新知