单元测试

Go本身提供了一套轻量级的测试框架。符合规则的测试代码会在运行测试时被自动识别并执行。单元测试源文件的命名规则如下:

  1. 必须是以_test.go结尾的文件,比如manager_test.go

Go的单元测试函数分为两类:功能测试函数和性能测试函数,分别以Test和Benchmark为函数名前缀并以*testing.T为单一参数的函数。下面是测试函数声明的例子:

  1. func TestAdd1(t *testing.T)
  2. 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单元测试的更多相关文章

  1. java+接口自动化+eclipse之-----环境搭建

    根据金字塔的比重总结,UI测试占用10%,接口测试占有20%,单元测试占用70%.考虑到之前学过一段时间的单元测试.UI测试,而接口测试未曾接触过,所以最近打算看看接口测试是怎么实现的. 首先,我们先 ...

  2. [持续交付实践] pipeline使用:Shared Libraries

    前言 随着pipeline交付流水线在团队中的推广,使用pipeline脚本的job也迅速增加.虽然我们已经基于公司的技术栈特点做了一个尽可能通用的pipeline脚本样例,让搭建者只需要修改几个赋值 ...

  3. [持续交付实践] pipeline使用:项目样例

    项目说明 本文将以一个微服务项目的具体pipeline样例进行脚本编写说明.一条完整的pipeline交付流水线通常会包括代码获取.单元测试.静态检查.打包部署.接口层测试.UI层测试.性能专项测试( ...

  4. task19-21

    [说明]理想是丰满的,现实很骨感,昨天还说今天有望干掉5个小任务,看来是没可能了,兜兜转转地做了一天也才完成下面的这些 一:今日完成 19.学习Spring,配置Spring和Junit 1)先安装一 ...

  5. task15-18

    [说明]貌似maven在真实的项目实战中挺重要的,可以省去大量的工作,有必要单独学习一下 15.创建一个新的maven项目 16.在src/main/java下随便创建一个java文件,clean,i ...

  6. 京东T8通过企业实例展示软件架构实际应用,带你迅速成为架构师

    在软件行业,架构师和软件工程师是非常辛苦的职业.一方面新技术层出不穷;另一方面业务需求也层出不穷,让人疲于应付.导致的后果就是常常加班,生活质量低下.只有曾经身在其中的人,才能够体会其中的酸甜苦辣. ...

  7. GO学习-(20) Go语言基础之单元测试

    Go语言基础之单元测试 不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go ...

  8. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  9. ABAP单元测试最佳实践

    本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...

随机推荐

  1. QThreadPool&QRunnable&类函数的使用

    QThreadPool+QRunnable线程池与QThread线程两种方式使用的场景不同,QThreadPool+QRunnable线程池主要用于那种不需要一直运行的任务,而QThread主要用于长 ...

  2. 吴伯凡:VUCA时代的自我迭代

    吴伯凡:VUCA时代的自我迭代 https://mp.weixin.qq.com/s?src=3&timestamp=1506588223&ver=1&signature=nv ...

  3. OEMbutton乱码问题解决

    一.出现故障: 在Linux环境中安装tid=12">Oracle 10g,启用EM时.出现button显示乱码现象,例如以下: 二.分析问题: 由于在安装Oracle10g时,JDK ...

  4. [转载]安装Oracle11gR2先决条件检查失败的详细解决处理过程

    原文地址:安装Oracle11gR2先决条件检查失败的详细解决处理过程作者:四海名汀 最近在32位Win7系统下安装Oracle11g发现一系列错误,现将详细的错误解决过程记录如下,以供大家参考. 一 ...

  5. linux查看及修改文件权限以及相关

    linux查看及修改文件权限以及相关 查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名)那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有1 ...

  6. UVA 11613 Acme Corporation(不固定流量的最小费用流)

    题意好长....变量好多.... 增加源点跟汇点.然后将每个月份看成一个点,然后拆成两个点u 跟 u+n. 从s向每个u连一条<n[u], m[i]>的弧,表示最多生产量及价值. 从每个u ...

  7. eclipse maven 导出项目依赖的jar包

    转自:https://blog.csdn.net/andyliulin/article/details/46544555 一.导出到默认目录 targed/dependency 从Maven项目中导出 ...

  8. MySQL 复习笔记

    本文内容 SQL 语句 创建数据库 创建数据表 数据完整性约束 四种基本字符类型说明 SQL 基本语句 类型转换函数 日期函数 数学函数 字符串函数 合并结果集 union CASE 函数用法 IF ...

  9. Android添加全屏启动画面

    有的Android软件需要在启动的时候显示一个启动画面,可以是一张图或者一些设置什么呢,还有一个好处就是,可以趁机在后台加载数据.创建启动画面一般有两种方式:1.建立一个activity,展示启动画面 ...

  10. VirtualBox安装增强功能报错

    VirtualBox默认不支持调整分辨率,想调整分辨率需要安装增强功能,点击菜单->设备->安装增强功能 我在安装的时候报错了,提示: 这个时候注意虚拟机的桌面,其实这个时候已经加载了虚拟 ...