安利一个好用的Golang单元测试框架:gocheck
Golang下如何写单元测试?官方提供的testing package略显简陋,不过好在我们有Gocheck。
什么是好的单元测试?
在进入正题前,先来温习下前人总结的单元测试几条原则:
http://www.atatech.org/articles/2523
1 单元测试应该在最低的功能/参数上验证程序的正确性
...
3 单元测试过后,机器状态保持不变
...
6 独立性,单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。
好的单元测试,应该遵循上面的原则;好的单元测试框架,应该为我们践行这些原则提供方便。
gocheck,简单好用
gocheck官网:http://labix.org/gocheck
Golang官方的testing package算是很弱的了:居然连assert都不支持。Gocheck在testing库之上,丰富了很多功能,带我们脱离Golang官方测试框架下无尽的“if…else…"苦海。尤其好用的特性包括:
- assert断言 + 丰富的判断动词: deep multi-type 对比, 字符串比较(甚至支持正则匹配!)。
- 按suite组织测试用例,支持suite级别的setup()和teardown()。
- 创建、删除临时文件/目录。
示例1:文件操作相关的单元测试
“单元测试过后,机器状态保持不变”的原则告诉我们,如果单元测试要读写文件,单元测试结束后要清理创建的临时文件。
gocheck可以创建一个临时目录,在测试结束时自动删除它,省去了手动清理的步骤。
示例:
package hello_testimport ("testing""io/ioutil""io". "gopkg.in/check.v1"
)const txt = "adfagaggafaf"// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) { TestingT(t) }type MySuite struct {dir string // 测试用的临时目录f string // 测试用的临时文件
}var _ = Suite(&MySuite{})// Setupsuite 准备测试用的临时文件
func (s *MySuite) SetUpSuite(c *C) {dir := c.MkDir() // Suite结束后会自动销毁c.MkDir()创建的目录tmpfile, err := ioutil.TempFile(dir, "")if err != nil {c.Errorf("Fail to create test file: %v\n", tmpfile.Name(), err)}err = WriteFile(tmpfile.Name(), txt)if err != nil {c.Errorf("Fail to prepare test file.%v\n", tmpfile.Name(), err)}s.dir = dirs.f = tmpfile.Name()
}func (s *MySuite) TestFoo(c *C) {// ... 实际测试代码c.Assert(bkpName, Matches, s.f+".ops_agent_bkp.+")
}
示例2:Mock web api相关的单元测试
“独立性”的原则告诉我们,对于需要调用外部api的功能,最好mock数据。利用gocheck的SetUpSuite()和TearDownSuite()方法,可以新建一个http test server,结束时关闭它。
示例:
package hello_testimport ("fmt""net/http""net/http/httptest""testing". "gopkg.in/check.v1"
)const (resp1 = `{"data" : {"cluster" : "*****","hostname" : "xxxxx"},"err_code" : 0,"err_msg" : ""
}
`resp2 = `{"data" : [{"hostname" : "e18h13551.XXX","ip" : "100.22.33.44","state" : "GOOD"},{"hostname" : "dddd","ip" : "101.14.12.55","state" : "GOOD"}],"err_code" : 0,"err_msg" : ""
}
`
)// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) { TestingT(t) }type MySuite struct {ts *httptest.Server
}func (s *MySuite) SetUpSuite(c *C) {h := http.NewServeMux()h.HandleFunc("/machine", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, resp1)})h.HandleFunc("/batch", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, resp2)})s.ts = httptest.NewServer(h)
}func (s *MySuite) TearDownSuite(c *C) {s.ts.Close()
}var _ = Suite(&MySuite{})func (s *MySuite) TestFoo(c *C) {// 实际测试代码....clusterName, err := getClusterName(s.ts.URL, "/machine")c.Assert(err, IsNil)c.Assert(clusterName, Equals, "MiniLVSCluster-5e87-2384205713506559")
}
其他
Gocheck其他好用的特性,比如强大的checker 就不在此列举。可以在官网上翻翻,让写单元测试更简单。
安利一个好用的Golang单元测试框架:gocheck相关推荐
- Golang 单元测试框架 gocheck 使用介绍
什么是好的单元测试框架? 单元测试应该在的功能和参数上验证程序的正确性:单元测试过后,机器状态应该保持不变:单元测试的运行.通过.失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性. Go ...
- catch2:一个好用的C++单元测试框架
文章目录 为什么需要catch 简单易用 命令行选项 Sections BDD-style Assertion Macros Floating point comparisons Exceptions ...
- golang单元测试框架GoConvey
GoConvey是一个非常非常好用的Go测试框架,它直接与go test集成,提供了很多丰富的断言函数,能够在终端输出可读的彩色测试结果 安装 go get github.com/smartystre ...
- golang单元测试框架实践
一.简介 单元测试主要是通过模拟业务中的参数,调用我们的函数,然后获取执行结果,再判断结果是否符合规则:同时还可以对某一个方法进行性能分析 在Go 标准库中有一个叫做 testing 的测试框架, 可 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整体的流程并不复杂.本篇我们就尝试编写一个精简版本的C++单元测试框架:nancytest ,通过编写这个简单的测试框架,将有助于我们理解g ...
- python单元测试框架unittest介绍和使用_Python+Selenium框架设计篇之-简单介绍unittest单元测试框架...
前面文章已经简单介绍了一些关于自动化测试框架的介绍,知道了什么是自动化测试框架,主要有哪些特点,基本组成部分等.在继续介绍框架设计之前,我们先来学习一个工具,叫unittest. unittest是一 ...
- 玩转Google开源C++单元测试框架
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
- c语言的自动测试工具,C语言单元测试框架--check工具
C语言单元测试框架--check工具 虽然在UNIX上用C语言做开发已经有一段时间了,但是我不得不承认,自己单元测试做的并不好.恰好最近有新的开发任务,就学习了一些关于测试驱动开发的知识,准备改进自己 ...
- 关于单元测试框架GoogleTest——参考《百度文库》、大量博客
本文章集齐百家之所长(又臭又长),读者可根据自己的需求自取: 一.关于测试 1.1 为啥要测试? 1.2 测试的分类 1.3 [单元测试-参考web[song]的博客] 1.3.1.为什么单元测试? ...
最新文章
- 省市县三级级联(模块化开发)
- android设备获取wifi和蓝牙状态并进行打开或关闭操作
- SYBASE里面出现客户端和服务器端字符集不匹配的情况解决方法
- Windows Update Error: 80244019
- Sklearn参数详解—LR模型
- git版本回退命令_Git学习版本回退和管理文件的修改及删除操作
- 【转载】别了,摩托罗拉(十):“战争部落”和“独立王国”
- activity与service 使用Handler Messenger数据传递
- Golang 五种原子性操作的用法详解
- javascript监听输入框_html通过JS/jQuery实现 实时监听输入框input的内容
- 海思Hi3518EV200 SDK源码分析笔记
- 【Chinapub读书会第9期】5月28日赵鑫磊带你深入解析Linux
- Elasticsearch-拼音分词/排序
- Hive3.1.2安装指南
- 下城投 × 奇点云 |「数智城投驾驶舱」,打造转型示范新样板
- 软考高级 真题 2015年上半年 信息系统项目管理师 综合知识
- 各大AI 开放平台一览
- 白领十大职业病及对策
- 【定积分】区间再现公式的证明及其推论
- 安卓远程连接linux软件,推荐Windows、Linux安卓远程软件
热门文章
- xshell的vbS脚本
- realvnc控制端安卓版,不能错过的realvnc控制端安卓版安装教程
- vue--实现todo案例
- 体验灵雀云-创建基于Docker的云服务
- 灵雀云第三期(2020-2021)传统行业云原生技术落地调研报告
- 1.Java接入银联支付(chinapay)教程及避坑点
- 巧用ThreadPool.QueueUserWorkItem实现接口二次调用
- nginx的简单教程
- 鼓式瞬态成型机 XLN Audio DS-10 Drum Shaper 1.0.5 WiN-MAC
- 明日风尚杂志明日风尚杂志社《明日风尚》杂志社2022年第10期目录