特征

Golang 单元测试对文件名和方法名,参数都有很严格的要求。例如:

1、文件名必须以 _test.go 结尾

2、方法名必须是 Test 开头

3、方法参数必须是 t *testing.T 或 b *testing.B

命令详解

go test 是 go 语言自带的测试工具,其中包含的是两类,单元测试(即 功能测试) 和 性能测试

通过 go help test 可以看到 go test 的使用说明:

格式:

  1. go test [-c] [-i] [build flags] [packages] [flags for test binary]

参数:

-c : 编译 go test 成为可执行的二进制文件,但是不运行测试。

-i : 安装测试包依赖的 package,但是不运行测试。

关于 build flags,调用 go help build,这些是编译运行过程中需要使用到的参数,一般设置为空

关于 packages,调用 go help packages,这些是关于包的管理,一般设置为空

关于 flags for test binary,调用 go help testflag,这些是 go test 过程中经常使用到的参数:

-test.v : 是否输出全部的单元测试用例(不管成功或者失败),默认没有加上,所以只输出失败的单元测试用例

-test.run pattern : 只跑哪些单元测试用例

-test.bench patten : 只跑那些性能测试用例

-test.benchmem : 是否在性能测试的时候输出内存情况

-test.benchtime t : 性能测试运行的时间,默认是1s

-test.cpuprofile cpu.out : 是否输出cpu性能分析文件

-test.memprofile mem.out : 是否输出内存性能分析文件

-test.blockprofile block.out : 是否输出内部goroutine阻塞的性能分析文件

-test.memprofilerate n : 内存性能分析的时候有一个分配了多少的时候才打点记录的问题。这个参数就是设置打点的内存分配间隔,也就是 profile 中一个 sample 代表的内存大小。默认是设置为 512 * 1024 的。如果你将它设置为 1,则每分配一个内存块就会在 profile 中有个打点,那么生成的 profile 的 sample 就会非常多。如果你设置为 0,那就是不做打点了

你可以通过设置 memprofilerate=1 和 GOGC=off 来关闭内存回收,并且对每个内存块的分配进行观察

-test.blockprofilerate n : 基本同上,控制的是 goroutine 阻塞时候打点的纳秒数。默认不设置就相当于 -test.blockprofilerate=1,每一纳秒都打点记录一下

-test.parallel n : 性能测试的程序并行 cpu 数,默认等于 GOMAXPROCS

-test.timeout t : 如果测试用例运行时间超过 t,则抛出 panic

-test.cpu 1,2,4 : 程序运行在哪些 CPU 上面,使用二进制的 1 所在位代表,和 nginx 的 nginx_worker_cpu_affinity 是一个道理

-test.short : 将那些运行时间较长的测试用例运行时间缩短

示例

单元测试(测试 某个包)

在 golang 的 src 目录下新建目录 math,测试目录结构如下:

ibonacci.go 代码如下,主要有一个 Fibonacci 函数

  1. package lib
  2.  
  3. // 斐波那契数列
  4. // 求出第n个数的值
  5. func Fibonacci(n int64) int64 {
  6. if n < 2 {
  7. return n
  8. }
  9. return Fibonacci(n-1) + Fibonacci(n-2)
  10. }

fibonacci_test.go 就是测试的文件了,golang 需要测试文件一律用 “_test” 结尾,测试的函数都用 Test 开头,代码如下:

  1. package lib
  2.  
  3. import (
  4. "testing"
  5. )
  6.  
  7. func TestFibonacci(t *testing.T) {
  8. r := Fibonacci(10)
  9. if r != 55 {
  10. t.Errorf("Fibonacci(10) failed. Got %d, expected 55.", r)
  11. }
  12. }

使用 go test 测试这个程序

  1. $ go test lib
  2. ok lib 0.008s

性能测试

结合上面的方法,这里测试一下函数的性能,如果需要进行性能测试,则函数开头使用 Benchmark 就可以了。

  1. // 性能测试
  2. func BenchmarkFibonacci(b *testing.B) {
  3. for i := 0; i < b.N; i++ {
  4. Fibonacci(10)
  5. }
  6. }

接下来执行这个性能测试:

  1. $ go test -bench=. lib
  2. PASS
  3. BenchmarkFibonacci 5000000 436 ns/op
  4. ok lib 2.608s

其中第二行输出表示这个函数运行了 5000000 次,平均运行一次的时间是 436ns。

这个性能测试只测试参数为 10 的情况。如果有需要可以测试多个参数:

  1. // 测试参数为5的性能
  2. func BenchmarkFibonacci5(b *testing.B) {
  3. for i := 0; i < b.N; i++ {
  4. Fibonacci(5)
  5. }
  6. }
  7.  
  8. // 测试参数为20的性能
  9. func BenchmarkFibonacci20(b *testing.B) {
  10. for i := 0; i < b.N; i++ {
  11. Fibonacci(20)
  12. }
  13. }

运行一下:

  1. $ go test -bench=. lib
  2. PASS
  3. BenchmarkFibonacci 5000000 357 ns/op
  4. BenchmarkFibonacci5 100000000 29.5 ns/op
  5. BenchmarkFibonacci20 50000 44688 ns/op
  6. ok lib 7.824s

如果性能测试的方法非常多,那需要的时间就会比较久。可以通过 -bench=参数 设置需要运行的性能测试方法:

  1. $ go test -bench=Fibonacci20 lib
  2. PASS
  3. BenchmarkFibonacci20 50000 44367 ns/op
  4. ok lib 2.677s

测试 某个文件

一定要带上被测试的原文件,否则会提示找不到包

  1. go test -v wechat_test.go wechat.go

测试 某个方法

  1. go test -v -test.run TestRefreshAccessToken

延伸阅读:

【Go命令教程】8. go test

[Go] 单元测试/性能测试 (go test)的更多相关文章

  1. golang 单元测试&&性能测试

    一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...

  2. 前端 TDD 开发

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px ".PingFang SC"; color: #454545 } p.p2 ...

  3. Go 收藏

    Golang 定位解决分布式系统,服务器应用开发,主要竞争对手是 Java.Python 之类:Rust 定位解决单机安全问题,高性能场景偏系统底层开发,主要竞争对手就是 C 和 C++. Golan ...

  4. KIP-5:Apache Kylin深度集成Hudi

    Q1. What are you trying to do? Articulate your objectives using absolutely no jargon. Q2. What probl ...

  5. go进阶--测试

    目录 1.单元测试 1.1项目结构 1.2 源代码文件 1.3 单元测试 1.4 执行测试 1.5 单元测试总结 2.性能测试 2.1 项目结构 2.2 源码文件 2.3 测试文件 2.4 执行测试 ...

  6. 【GoLang】GoLang 单元测试、性能测试使用方法

    单元测试代码: ackage test import ( // "fmt" "testing" ) func Test_FlowControl(t *testi ...

  7. Golang 语言的单元测试和性能测试(也叫 压力测试)

    Golang单元测试对文件名和方法名,参数都有很严格的要求. 例如: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头(T必须大写),func TestXxx (t * ...

  8. 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

    黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...

  9. scala单元测试,包括功能测试和性能测试

    十分简单的scala单元测试 在编写性能要求高的模块的时候,单元测试是有必要的,通过搜索,我找到了一套提供单元功能测试和性能测试的可行方案,该方案简单好用,推荐给大家. 测试工具 首先找到适用于sca ...

随机推荐

  1. python技巧 合并两个字典

    python 3.5+ 版本 In [1]: a={'x':2,'y':4} In [2]: b={'c':1,'d':3} In [3]: c={'c':3,'y':6} In [4]:  w={* ...

  2. linux命令中which、whereis、locate有什么区别?

    1.find find是最常用和最强大的查找命令.它能做到实时查找,精确查找,但速度慢. find的使用格式如下: #find [指定目录] [指定条件] [指定动作] 指定目录:是指所要搜索的目录和 ...

  3. BAT获取FTP指定文件

    以下两个文件放在同一目录下 getfile.bat文件内容如下: @echo offftp.exe -i -s:getfile.txt 192.168.1.2(更换成你的ip,参数之间有空格)paus ...

  4. SQLServer xp_instance_regread returned error 5,Access is denied(配置最小权限)

    公司一套智能巡检系统,客户需要最小的权限去给这套系统使用:配置完后发现很多权限报错,有一条是关于xp_instance_regread读系统注册表error 5的报错.常理error 5.是属于系统权 ...

  5. yum安装软件报错:curl#6 - "Could not resolve host: mirrorlist.centos.org; Temporary failure in name resolut

    # yum install -y epel-release Loaded plugins: fastestmirror Repository base is listed more than once ...

  6. centos下配置nginx支持php

    添加nginx 默认主页index.php vim .../etc/nginx/conf.d/default.conf location / { root   /usr/share/nginx/htm ...

  7. WCF服务安全控制之netTcpBinding的用户名密码验证【转】

    选择netTcpBinding WCF的绑定方式比较多,常用的大体有四种: wsHttpBinding basicHttpBinding netTcpBinding wsDualHttpBinding ...

  8. jquery-扩展

    jQuery扩展三种方式:$.extend,$.fn.extend,外部文件. 1)jQuery.extend(object) 调用   $.方法 2)jQuery.fn.extend(object) ...

  9. python2.x下pip install mysql-python报错解决办法

    在https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 下载该驱动网盘链接:https://pan.baidu.com/s/1r0fNYnU ...

  10. 算法笔记(C++)

    一.基础篇 C++标准模板库(STL) 1.vector 可以理解为“变长数组” #include <vector> vector<typename> name; vector ...