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></res_code><res_message></res_message><can_use></can_use></XMLRsp>]
XMLRsp_Parse result is: [{{ XMLRsp} }]
PASS
ok myxml .016s

表示这次测试的结果为PASS,大功告成,你可以忙着写其他的代码去了^-^

Go语言test之类方法测试的更多相关文章

  1. WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

    这篇文章主要介绍了WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍,WQL是指Windows管理规范查询语言,需要的朋友可以参考下 WQL就是WMI中的查询语言,WQL的全称是W ...

  2. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  3. 七中滤波方法测试matlab实现

    http://blog.163.com/xiaheng0804@126/blog/static/1205282120132129471816/ 创建两个混合信号,便于更好测试滤波器效果.同时用七中滤波 ...

  4. [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  5. Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)

    ---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...

  6. Go语言的构建方法总结

    趁着近期要换工作的空闲时间,看了一下Go语言,与C++相比,Go语言的确在不少地方轻便了不少,例如:增加了内置的字符串类型.多个返回值.支持协程.简单的构建方法等等.使得在生产效率方面有了不少的提高. ...

  7. 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  8. JavaScript回调函数及数组方法测试

    JavaScript回调函数及数组方法测试 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> &l ...

  9. C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

随机推荐

  1. Android判断GPS是否开启和强制帮用户打开GPS

    引子:在我们的应用为用户提供定位服务时,通常想为用户提供精确点的定位服务,这是需要用户配合的.我们必须先检测用户手机的GPS当前是否打开,若没打开则弹出对话框提示.用户若不配合我们也没办法,只能采用基 ...

  2. SQL Server Reporting Service(SSRS) 第二篇 SSRS数据分组Parent Group

    SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子默认使用Table进行简单的数据显示,有时为了进行更加直观的数据显示,我们需要按照某个字段对列表进行 ...

  3. 根据不同的ie的版本号,制定不同的方法

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  5. [转]Python os.path模块

    os.path模块 原文链接:http://my.oschina.net/cuffica/blog/33494 basename('文件路径')    去掉目录路径,返回fname文件名 import ...

  6. uva 12549

    12549 - Sentry Robots Time limit: 1.000 seconds We need to guard a set of points of interest using s ...

  7. java selenium (九) 常见web UI 元素操作 及API使用

    本篇介绍我们如何利用selenium 来操作各种页面元素 阅读目录  链接(link) <div> <p>链接 link</p> <a href=" ...

  8. 在RichFaces中使用Facelets模板

    在RichFaces中使用Facelets模板 目录 Facelets简介 Facelets标签 创建相应文件 Facelets简介 Facelets是用来构建JSF应用程序的默认视图技术.它为表现层 ...

  9. 【接口】【USB】1.学习笔记

    1.USB的优点: 可以热插拔,即插上后可以自动识别: 系统总线供电,USB共有四根线,一根电源线,一根地线,一根D+线,一根D-线,D+和D-线是差分输入线: 可以支持多种设备,且扩展容易,通过HU ...

  10. 实验8 SQLite数据库操作

    实验报告 课程名称 实验8  SQLite数据库操作 实验日期 2016.5.6 实验项目名称 多媒体应用开发 实验地点 S30010 实验类型 □验证型    √设计型    □综合型 学  时 一 ...