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. ...
随机推荐
- redis 在 php 中的应用(Server[ 服务器] 篇)
本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Server(服务器) BGREWRITEAOF BGSA ...
- Linux使用命令 笔记
1.解压缩 tar -zxvf hadoop.xx.tar.gz2.重命名 mv hadoop-1.1.2 hadoop 3.创建文件夹 mkdir 文件夹名 4.vi编辑器 在一般模式下输入“ZZ” ...
- 在Springboot2.0项目中使用Druid配置多数据源
在Springboot出现之前配置数据源以及相关的事物,缓存等内容一直是个繁琐的工作,但是Springboot出现后这些基本都可以靠默认配置搞定,就变得很轻松了.这就是现在推崇模板>配置的原因, ...
- 使用JDBC在MySQL数据库中快速批量插入数据
使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: void addBatch ...
- windows server 2012 浏览器IE10无法下载。
cannot download in IE 10 of window server 2012 中文版解决办法: 1.打开IE,按F12,选择兼容浏览器为IE 9 2.选择IE的Internet选项菜单 ...
- 如何将Ubuntu Server 12.04 升级到 Ubuntu Server 14.04 LTS
升级Ubuntu 12.04到Ubuntu 14.04方法如下: 步骤一:在终端中运行下面的命令,它将安装所有的升级包.$ sudo apt-get update && sudo ap ...
- easyui tab上面添加右键菜单
说扩展,我觉得有点过了,只是加入了右击TAB选项卡时显示关闭的上下文菜单,先看下效果图: 具体实现代码: 右键菜单 HTML: <div id="mm" class=&quo ...
- 审核流(1)SNF.WorkFlow审核流简介--SNF快速开发平台3.1
本项目是的在Spring.Net.Framework 平台之上进行研发.SNF.WorkFlow审核流是一款完全自主知识产权研发的为软件项目. 审核流基本概念:什么是审核流? 审核流:两个或两个以上的 ...
- R8500 MPv2 版本 刷 Kong编译的 ddwrt 后,使用Entware-ng 安装opkg安装第三方软件
先说R8500吧. 由于Netgear网件的问题导致R8500在去年双11前夕出现了全球范围的Boot Loop的问题,现象为新设备开机一段时间后,路由器进入不停重启的状态,电源灯桔黄色.在和网件工程 ...
- struts2:多业务方法的处理(动态调用,DMI)
struts2支持调用指定Action类中某一个业务方法.如果没有指定,则调用execute方法. 1. 第一种实现方式,通过URL叹号参数 1.1 创建Action类,带多个方法 package c ...