20 go单元测试
单元测试
Go本身提供了一套轻量级的测试框架。符合规则的测试代码会在运行测试时被自动识别并执行。单元测试源文件的命名规则如下:
- 必须是以_test.go结尾的文件,比如manager_test.go
Go的单元测试函数分为两类:功能测试函数和性能测试函数,分别以Test和Benchmark为函数名前缀并以*testing.T为单一参数的函数。下面是测试函数声明的例子:
- func TestAdd1(t *testing.T)
- func BenchamarkAdd1(t *testing.T)
下面我们看下例子
功能性单元测试代码
这里我有2个代码文件,一个是代码文件,一个测试代码文件,共放在lib目录下。
----- lib目录
|____ manager.go
|____ manager_test.go
我们看下测试文件代码,走功能测试的代码,必须是以Test开头的方法,因为我们传入的是*testing.T的参数,所以函数名必须是Test开头的
// manager_test
package library
import (
"testing" // 测试包
)
func TestOps(t *testing.T) {
mm := NewMusicManager()
if mm == nil {
t.Error("NewMusicManager failed")
}
if mm.Len() != 0 {
t.Error("NewMusicManager failed,not empty")
}
m0 := &MusicEntry{
"1", "My Heart Will GO On", "Celion Dion", "http://qbox.me/210394", "mp3",
}
mm.Add(m0)
if mm.Len() != 1 {
t.Error("MusicManager.Add() failed")
}
m := mm.Find(m0.Name)
if m == nil {
t.Error("MusicManager.Find() failed!")
}
if m.Id != m0.Id || m.Artist != m0.Artist || m.Name != m0.Name || m.Source != m0.Source || m.Type != m0.Type {
t.Error("MusicManager.Find() failed. Found item mismatch.")
}
m, err := mm.Get(0)
if m == nil {
t.Error("MusicManager.Get() Failed.", err)
}
m = mm.Remove(0)
if m == nil || mm.Len() != 0 {
t.Error("MusicManager.Remove() failed", err)
}
}
编写完成后,我们直接切换到这个lib目录下,执行go test 即可
D:\LeoLearn\GoLearn\src\go_dev\musicPlayer\lib>go test
PASS ---> 执行成功
ok go_dev/musicPlayer/lib 0.469s
出现PASS和ok,那么就说明我们编写的测试代码ok没有问题,manager这个程序也OK,通过了测试代码。
性能性单元测试
我们可以使用go自带的test模块来做性能测试,由于传入的是testing.B参数,所以这里我们的函数必须以Benchmark。 如下所示
func Add(a, b int) int {
return a + b
}
func BenchmarkHowFast(b *testing.B) {
b.StopTimer()
time.Sleep(time.Second)
b.StartTimer()
for i := 0; i < b.N; i++ {
Add(i, i+1)
}
}
full example :
// manager_test
package library
import (
"testing"
"time"
)
func TestOps(t *testing.T) {
mm := NewMusicManager()
if mm == nil {
t.Error("NewMusicManager failed")
}
if mm.Len() != 0 {
t.Error("NewMusicManager failed,not empty")
}
m0 := &MusicEntry{
"1", "My Heart Will GO On", "Celion Dion", "http://qbox.me/210394", "mp3",
}
mm.Add(m0)
if mm.Len() != 1 {
t.Error("MusicManager.Add() failed")
}
m := mm.Find(m0.Name)
if m == nil {
t.Error("MusicManager.Find() failed!")
}
if m.Id != m0.Id || m.Artist != m0.Artist || m.Name != m0.Name || m.Source != m0.Source || m.Type != m0.Type {
t.Error("MusicManager.Find() failed. Found item mismatch.")
}
m, err := mm.Get(0)
if m == nil {
t.Error("MusicManager.Get() Failed.", err)
}
m = mm.Remove(0)
if m == nil || mm.Len() != 0 {
t.Error("MusicManager.Remove() failed", err)
}
}
func Add(a, b int) int {
return a + b
}
func BenchmarkHowFast(b *testing.B) {
b.StopTimer()
time.Sleep(time.Second)
b.StartTimer()
for i := 0; i < b.N; i++ {
Add(i, i+1)
}
}
然后我们执行下测试代码,由于加入了性能测试代码,我们需要加入 -bench
参数
D:\LeoLearn\GoLearn\src\go_dev\musicPlayer\lib>go test -bench="."
// Benchmark名字-cpu 循环次数 平均每次执行时间(纳秒)
BenchmarkHowFast-4 2000000000 0.39 ns/op
PASS
ok go_dev/musicPlayer/lib 7.249s
20 go单元测试的更多相关文章
- java+接口自动化+eclipse之-----环境搭建
根据金字塔的比重总结,UI测试占用10%,接口测试占有20%,单元测试占用70%.考虑到之前学过一段时间的单元测试.UI测试,而接口测试未曾接触过,所以最近打算看看接口测试是怎么实现的. 首先,我们先 ...
- [持续交付实践] pipeline使用:Shared Libraries
前言 随着pipeline交付流水线在团队中的推广,使用pipeline脚本的job也迅速增加.虽然我们已经基于公司的技术栈特点做了一个尽可能通用的pipeline脚本样例,让搭建者只需要修改几个赋值 ...
- [持续交付实践] pipeline使用:项目样例
项目说明 本文将以一个微服务项目的具体pipeline样例进行脚本编写说明.一条完整的pipeline交付流水线通常会包括代码获取.单元测试.静态检查.打包部署.接口层测试.UI层测试.性能专项测试( ...
- task19-21
[说明]理想是丰满的,现实很骨感,昨天还说今天有望干掉5个小任务,看来是没可能了,兜兜转转地做了一天也才完成下面的这些 一:今日完成 19.学习Spring,配置Spring和Junit 1)先安装一 ...
- task15-18
[说明]貌似maven在真实的项目实战中挺重要的,可以省去大量的工作,有必要单独学习一下 15.创建一个新的maven项目 16.在src/main/java下随便创建一个java文件,clean,i ...
- 京东T8通过企业实例展示软件架构实际应用,带你迅速成为架构师
在软件行业,架构师和软件工程师是非常辛苦的职业.一方面新技术层出不穷;另一方面业务需求也层出不穷,让人疲于应付.导致的后果就是常常加班,生活质量低下.只有曾经身在其中的人,才能够体会其中的酸甜苦辣. ...
- GO学习-(20) Go语言基础之单元测试
Go语言基础之单元测试 不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
随机推荐
- 并查集 (Union-Find Sets)及其应用
定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的 ...
- Android Studio 使用过程遇到的坑
最近在尝试Android Studio打Jar的包,然而事实并不是想象的那么简单,so,写多个坑的解决,以备不时之需. 1.Error:Execution failed for task ':app: ...
- android http中请求访问添加 cookie
第一种HashMap<String, String> map = new HashMap<String, String>();map.put("cookie" ...
- VMware内CentOS7虚拟机硬盘扩容
转自:https://blog.csdn.net/Wang_Xin_SH/article/details/77872885 简介 CentOS7虚拟机原硬盘空间只分配了10GB,需要扩容到20GB. ...
- 【Little Demo】左右按钮tab选项卡双切换
通过前一篇文章 从简单的Tab标签到Tab图片切换 的说明,相关效果也就可以实现了. 1.左右按钮tab选项卡双切换 很明显,左右两个按钮是 absolute 布局,另外就是内容部分和Tab标签部分. ...
- windows多线程同步--事件
推荐参考博客:秒杀多线程第六篇 经典线程同步 事件Event 事件是内核对象,多用于线程间通信,可以跨进程同步 事件主要用到三个函数:CreateEvent,OpenEvent,SetEvent, ...
- 最新整合maven+SSM+Tomcat 实现注册登录
mybatis学习 http://www.mybatis.org/mybatis-3/zh/index.html Spring学习:http://blog.csdn.net/king1425/arti ...
- Tuxedo低版本客户端(Tuxedo 9)连接到高版本Tuxedo服务端(Tuxedo 12.1.3)的问题
经过我实测,是没问题的.但是客户端的Tuxedo DLL必须全部是Tuxedo 9的DLL,不能混用.不然即使用Dependency Walker 分析DLL依赖完全正确,但是实际运行时结果也会出现奇 ...
- 如何在servlet刚启动时候获取服务器根目录?
public class InitServlet extends HttpServlet{ public static String root; @Override public void init( ...
- Cortex-A15架构解析:它为什么这么强(转)
今年的新手机趋势无异是全面向四核靠拢,不过同样是四核,在实际的性能上其实是千差万别.例如针对入门级主流市场的四核手机普遍采用的都是Cortex-A7以及 Cortex-A9 级别的CPU内核,这类内核 ...