基础

可以通过 go test -h 查看帮助信息。

其基本形式是:

go test [build/test flags] [packages] [build/test flags & test binary flags]

执行 go test 命令,它会在 *_test.go 中寻找 test 测试benchmark 基准 和 examples 示例 函数。测试函数必须以 TestXXX 的函数名出现(XXX 为以非小写字母开头),基准函数必须以 BenchmarkXXX 的函数名出现,示例函数必须以 ExampleXXX 的形式。三种函数类似下面的签名形式:

// test 测试函数
func TestXXX(t *testing.T) { ... } // benchmark 基准函数
func BenchmarkXXX(b *testing.B) { ... } // examples 示例函数,其相关命名方式可以查看第一篇文章
func ExamplePrintln() {
Println("The output of\nthis example.")
// Output: The output of
// this example.
}

func ExamplePerm() {
for _, value := range Perm(4) {
fmt.Println(value)
} // Unordered output: 4
// 2
// 1
// 3
// 0
}

更多请查看 go help testfunc

go test 命令还会忽略 testdata 目录,该目录用来保存测试需要用到的辅助数据。

go test 有两种运行模式:

1、本地目录模式,在没有包参数(例如 go test 或 go test -v)调用时发生。在此模式下,go test 编译当前目录中找到的包和测试,然后运行测试二进制文件。在这种模式下,caching 是禁用的。在包测试完成后,go test 打印一个概要行,显示测试状态、包名和运行时间。

2、包列表模式,在使用显示包参数调用 go test 时发生(例如 go test mathgo test ./... 甚至是 go test .)。在此模式下,go 测试编译并测试在命令上列出的每个包。如果一个包测试通过,go test 只打印最终的 ok 总结行。如果一个包测试失败,go test 将输出完整的测试输出。如果使用 -bench 或 -v 标志,则 go test 会输出完整的输出,甚至是通过包测试,以显示所请求的基准测试结果或详细日志记录。

下面详细说明下 go test 的具体用法,flag 的作用及一些相关例子。需要说明的是:一些 flag 支持 go test 命令和编译后的二进制测试文件。它们都能识别加 -test. 前缀的 flag,如 go test -test.v,但编译后的二进制文件必须加前缀 ./sum.test -test.bench=.

有以下测试文件 sum.go:

package sum

func Sum(a, b int) int {
return a + b
}

sum_test.go 内容:

package sum

import (
"flag"
"fmt"
"testing"
"time"
) var print bool func init() {
flag.BoolVar(&print, "p", false, "print test log")
flag.Parse()
} func TestSum(t *testing.T) {
val := Sum(1, 2)
if print {
fmt.Println("sum=", val)
}
} // -bench 基准测试
func BenchmarkSum(b *testing.B) {
for i := 0; i < b.N; i++ {
Sum(i, i+1)
}
} // -timeout 测试
func TestSumLongTime(t *testing.T) {
time.Sleep(time.Second * 2)
Sum(1, 2)
} // 子测试
func TestSumSubTest(t *testing.T) {
t.Run("1+2", func(t *testing.T) {
val := Sum(1, 2)
t.Log("1+2=", val)
})
t.Run("2+3", func(t *testing.T) {
val := Sum(2, 3)
t.Log("2+3=", val)
})
} // 子测试,无具体子测试
func TestSumSubTest2(t *testing.T) {
val := Sum(2, 3)
t.Log("no subtest=", val)
} // 并发测试
func TestSumParallel(t *testing.T) {
t.Parallel()
Sum(1, 2)
} func TestSumParallel2(t *testing.T) {
t.Parallel()
Sum(1, 2)
}

test flag

以下 flag 可以跟被 go test 命令使用:

  • -args:传递命令行参数,该标志会将 -args 之后的参数作为命令行参数传递,最好作为最后一个标志。
  $ go test -args -p=true
  • -c:编译测试二进制文件为 [pkg].test,不运行测试。
  $ go test -c && ./sum.test -p=true
  • -exec xprog:使用 xprog 运行测试,行为同 go run 一样,查看 go help run
  • -i:安装与测试相关的包,不运行测试。
  $ go test -i
  • -o file:编译测试二进制文件并指定文件,同时运行测试。
  go test -o filename

test/binary flag

以下标志同时支持测试二进制文件和 go test 命令。

  • -bench regexp:通过正则表达式执行基准测试,默认不执行基准测试。可以使用 -bench .-bench=.执行所有基准测试。
  $ go test -bench=.
$ go test -c
$ ./sum.test -test.bench=.
  • -benchtime t:每个基准测试运行足够迭代消耗的时间,time.Duration(如 -benchtime 1h30s),默认 1s。
  $ go test -bench=. -benchtime 0.1s
$ ./sum.test -test.bench=. -test.benchtime=1s
  • -count n:运行每个测试和基准测试的次数(默认 1),如果 -cpu 指定了,则每个 GOMAXPROCS 值执行 n 次,Examples 总是运行一次。
  $ go test -bench=. -count=2
$ ./sum.test -test.bench=. -test.count=2
  • -cover:开启覆盖分析,开启覆盖分析可能会在编译或测试失败时,代码行数不对。
  $ go test -bench=. -cover
  • -covermode set,count,atomic:覆盖分析的模式,默认是 set,如果设置 -race,将会变为 atomic。

    • set,bool,这个语句运行吗?
    • count,int,该语句运行多少次?
    • atomic,int,数量,在多线程正确使用,但是耗资源的。
  • -coverpkg pkg1,pkg2,pkg3:指定分析哪个包,默认值只分析被测试的包,包为导入的路径。
  # sum -> $GOPATH/src/test/sum
$ go test -coverpkg test/sum
  • -cpu 1,2,4:指定测试或基准测试的 GOMAXPROCS 值。默认为 GOMAXPROCS 的当前值。
  • -list regexp:列出与正则表达式匹配的测试、基准测试或 Examples。只列出顶级测试(不列出子测试),不运行测试。
  $ go test -list Sum
  • -parallel n:允许并行执行通过调用 t.Parallel 的测试函数的最大次数。默认值为 GOMAXPROCS 的值。-parallel 仅适用于单个二进制测试文件,但go test命令可以通过指定 -p 并行测试不同的包。查看 go help build
  $ go test -run=TestSumParallel -parallel=2
  • -run regexp:只运行与正则表达式匹配的测试和Examples。我们可以通过 / 来指定测试子函数。go test Foo/A=,会先去匹配并执行 Foo 函数,再查找子函数。
  $ go test -v -run TestSumSubTest/1+
  • -short:缩短长时间运行的测试的测试时间。默认关闭。
  $ go test -short
  • -timeout d:如果二进制测试文件执行时间过长,panic。默认10分钟(10m)。
  $ go test -run TestSumLongTime -timeout 1s
  • -v:详细输出,运行期间所有测试的日志。
  $ go test -v

analyze flag

以下测试适用于 go test 和测试二进制文件:

  • -benchmem:打印用于基准的内存分配统计数据。
  $ go test -bench=. -benchmem
$ ./sum.test -test.bench -test.benchmem
  • -blockprofile block.out:当所有的测试都完成时,在指定的文件中写入一个 goroutine 阻塞概要文件。指定 -c,将写入测试二进制文件。
  $ go test -v -cpuprofile=prof.out
$ go tool pprof prof.out
  • -blockprofilerate n:goroutine 阻塞时候打点的纳秒数。默认不设置就相当于 -test.blockprofilerate=1,每一纳秒都打点记录一下。
  • -coverprofile cover.out:在所有测试通过后,将覆盖概要文件写到文件中。设置过 -cover。
  • -cpuprofile cpu.out:在退出之前,将一个 CPU 概要文件写入指定的文件。
  • -memprofile mem.out:在所有测试通过后,将内存概要文件写到文件中。
  • -memprofilerate n:开启更精确的内存配置。如果为 1,将会记录所有内存分配到 profile。
  $ go test -memprofile mem.out -memprofilerate 1
$ go tool pprof mem.out
  • -mutexprofile mutex.out:当所有的测试都完成时,在指定的文件中写入一个互斥锁争用概要文件。指定 -c,将写入测试二进制文件。
  • -mutexprofilefraction n:样本 1 在 n 个堆栈中,goroutines 持有 a,争用互斥锁。
  • -outputdir directory:在指定的目录中放置输出文件,默认情况下,go test 正在运行的目录。
  • -trace trace.out:在退出之前,将执行跟踪写入指定文件。

Golang Testing单元测试指南的更多相关文章

  1. golang test 单元测试

    golang自家的单元测试做的很好了,自需要"文件名_test.go" 就可以在里面写单元测试,而且go test命令也很强大,可以只运行单个测试函数,在goland 可以点击单元 ...

  2. [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]

    [易学易懂系列|rustlang语言|零基础|快速入门|(15)] 实用知识 Unit Testing单元测试 我们知道,在现代软件开发的过程中,单元测试对软件的质量极及重要. 今天我们来看看Rust ...

  3. Golang ---testing包

    golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能. 建议安装gotests插件自动生成测试代码: go get -u -v github.com ...

  4. Golang之单元测试

    文件名必须以_test.go结尾 使用go test 执行单元测试 例 package main func add(a, b int) int { return a + b } func sub(a, ...

  5. Microsoft Visual Studio 2010 VSTS单元测试指南

    本来以为很简单的一个问题,今天预计10分钟搞定,结果到下班还没弄出结果,单元测试运行的时候一直处于无反应状态,最后估计可能是我装的2010有问题,结果到家一试果然是有问题,有时软件就是这么神奇. 言归 ...

  6. Microsoft Visual Studio 2013 VSTS单元测试指南

    安装vs2013时并未安装VSTS工具包,所以在工具栏:工具->拓展和更新   进行下载安装 vs13已经用了两年了,相比于之前老师推荐的vc6.0感觉要强出很多,刚上手时感觉比较困难,在使用一 ...

  7. Golang redis 学习指南

    安装 我使用的是 https://github.com/go-redis/r... 这个 golang 客户端, 因此安装方式如下: go get gopkg.in/redis.v4 接着在代码中导入 ...

  8. Java服务端单元测试指南

    https://juejin.im/entry/5acad0806fb9a028cd456236

  9. c++单元测试指南:使用google test

    Reference:http://www.codeproject.com/Articles/811934/Cplusplus-unit-test-start-guide-how-to-set-up-G ...

随机推荐

  1. PHP作用域和文件夹操作

    1.作用域      1.1变量作用域      1.全局变量:在函数外面       2.局部变量:在函数里面,默认情况下,函数内部是不会访问函数外部的变量       3.超全局变量:可以在函数内 ...

  2. DesignPattern系列__08UML相关知识

    前言 现在,很少有人和90年代一样,自己去实现一个软件的各个方面,也就是说,在工作中,和人沟通是必备的技能.那么,作为一枚码农,如何和他人沟通呢?这就要依靠本文的主题了--UML. 简介 UML--U ...

  3. Python上下文管理器的使用

    上下文管理器可以控制代码块执行前的准备动作,以及执行后的清理动作. 创建一个上下文管理器类的步骤:(1)一个__init__方法,来完成初始化(可选)(2)一个__enter__方法,来完成所有建立工 ...

  4. [N久以前发布的文章]php 获取yahoo股票csv数据并封闭成为接口输出json数据

    思路 先从yahoo接口获取数据,再定义接口,转化成为json输出.只供卡通网(kt5.cn)使用 stock.php 接口处理代码 <?php header("Content-Typ ...

  5. MySQL 设置表注释

    新增表增加注释 CREATE TABLE sys_tables ( owner ) NOT NULL COMMENT '归属用户', table_name ) NOT NULL COMMENT '表名 ...

  6. python中的随机模块random

    random模块是 python 中为随机数所使用的模块 ```import random # 随机生成0-1范围内的随机浮点数i = random.random()print(i) # 随机生成范围 ...

  7. 用Toad for Oracle创建数据库表空间和用户

    打开Toad, 1,菜单栏Session—>new Connection….打开如下窗口: 2,进入之后,菜单DatebaseàSechema  Brower...找到Table Space(表 ...

  8. Lnmp架构部署动态网站环境.2019-7-3-1.3

    Php安装 一.安装准备 1.Php依赖包 [root@Lnmp tools]# yum install -y zlib libxml libjpeg freetype libpng gd curl ...

  9. 运行输出时候遇到了Json.Disosi@3fa77460格式·

    比如我的运行输出时候遇到了Json.Disosi@3fa77460这种类路径+@+储存空间编码格式 发现是实体类忘记加了toString方法 使用ALT+ins快捷键点击toString()方法 再运 ...

  10. Windows环境下搭建Redis集群(Redis-x64-3.2.100)

    一 .前期准备Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二.安装配置redisredis下载地址 ht ...