单元测试

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. 解决iframe重复嵌套登陆页面的问题

    在login.jsp中加入即可 // 在被嵌套时就刷新上级窗口 if(window.parent != window){ window.parent.location.reload(true); }

  2. bzoj 3143 随机游走

    题意: 给一个简单无向图,一个人从1号节点开始随机游走(即以相同概率走向与它相邻的点),走到n便停止,问每条边期望走的步数. 首先求出每个点期望走到的次数,每条边自然是从它的两个端点走来. /**** ...

  3. 一些公司的面试题目 U3D

    #include <iostream> using namespace std; int main() { int N; while (cin>>N&&N> ...

  4. 细说ASP.NET Windows身份认证

    上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Ac ...

  5. ASP.NET Web API中把分页信息放Header中返回给前端

    谈到ASP.NET Web API的分页,考虑的因素包括: 1.上一页和下一页的uri2.总数和总页数3.当前页和页容量 接着是服务端的数据以怎样的形式返回? 我们通常这样写: {    totalC ...

  6. C#语言

    封面 书名 版权 前言 目录 第Ⅰ部分 C#语言 第1章  NET体系结构 1.1  C#与.NET的关系 1.2  公共语言运行库 1.2.1  平台无关性 1.2.2  提高性能 1.2.3  语 ...

  7. Online

    上线前的准备: 1.是在本地测试的时候,以为页面上没有php的warning代码就是正确的,没有查看apache的error_log中相关的记录,然后就直接上线了.

  8. [Python设计模式] 第2章 商场收银软件——策略模式

    github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...

  9. 用 CPI 火焰图分析 Linux 性能问题

    https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题   yangoliver 2018-02-11 16:05:53 浏览1076 ...

  10. supervisor //todo

    #安装easy-installyum install python-setuptools #安装 supervisoreasy_install supervisor #创建主配置文件echo_supe ...