Go语言 单元测试

abv123456789 · · 1096 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go语言提供了完善的单元测试支持,开发人员可以方便的编写测试代码,保证自己代码的质量。在目前的例子中,一般看到都是普通函数的例子。下面我将通过类方法的单元测试例子来展示一下Go语言的魅力。

首先是代码所在的文件xml.go:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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,包括以下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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,大功告成,你可以忙着写其他的代码去了^-^


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go语言 单元测试

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1096 次点击  
加入收藏 微博
上一篇:golang
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传