Go 测试单个方法

gotest.go

package mytest

import (
    "errors"
)

func Division(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("除数不能为0")
    }
    return a / b, nil
}

gotest_test.go

package mytest

import (
    "testing"
)

func Test_Division_1(t *testing.T) {
    if i, e := Division(6, 2); i != 3 || e != nil { //try a unit test on function
        t.Error("除法函数测试没通过") // 如果不是如预期的那么就报错
    } else {
        t.Log("第一个测试通过了") //记录一些你期望记录的信息
    }
}

func Test_Division_2(t *testing.T) {
    if _, e := Division(6, 0); e == nil { //try a unit test on function
        t.Error("Division did not work as expected.") // 如果不是如预期的那么就报错
    } else {
        t.Log("one test passed.", e) //记录一些你期望记录的信息
    }
}

gotest_b_test.go

package mytest
import (
    "testing"
)
func Benchmark_Division_1(b *testing.B) {
    , ); i !=  || e != nil { //try a unit test on function
        b.Error("除法函数测试没通过") // 如果不是如预期的那么就报错
    } else {
        b.Log("第一个测试通过了") //记录一些你期望记录的信息
    }
}

func Benchmark_Division_2(b *testing.B) {
    , ); e == nil { //try a unit test on function
        b.Error("Division did not work as expected.") // 如果不是如预期的那么就报错
    } else {
        b.Log("one test passed.", e) //记录一些你期望记录的信息
    }
}

1. 在目录下执行 go test  是测试目录所有以XXX_test.go 结尾的文件。

2.测试单个方法  下面2种写法。

  go test -test.v  -test.run="Test_Division_1" -test.count 5
       go test -v  -run="Test_Division_1" -count 5

       go test -v  #测试目录下所有*_test方法。

       go test -v gotest_test.go gotest.go    //测试整个文件,要带上依赖文件

       go test -v gotest.go gotest_test.go -test.run Test_Division_1   //测试单个函数

       go test -v -bench=.    //性能测试,测所有方法, 

       go test -v -bench=Division_2    //性能测试,测单个方法,

       go test -v -bench=".*"  //性能测试,返回结果表示这个测试用例在1s中内运行了2000次,每次调用大约用了891898ns

-v参数,如果不加这个参数的话,只会显示错误的测试用例,否则就显示所有的测试用例(成功 + 错误)

3.查看帮助 go test -help   

用性能测试生成CPU状态图

使用命令:

go test -bench=".*" -cpuprofile=cpu.prof -c

cpuprofile是表示生成的cpu profile文件, -c是生成可执行的二进制文件,这个是生成状态图必须的,它会在本目录下生成可执行文件mymysql.test

然后使用go tool pprof工具: go tool pprof test0528.test cpu.prof

调用web(需要安装graphviz)

显示svg文件已经生成了

1.创建测试文件夹mysql,文件夹下的go文件的package必须与文件夹名一致(不然会识别不到)

2.创建需要测试的文件mysql.go(使用github.com/go-sql-driver/mysql包)

3.创建单元测试用例文件mysql_test.go(文件名必须是*_test.go的类型,*代表要测试的文件名,函数名必须以Test开头如:TestXxx或Test_xxx)

4.创建benchmark性能测试用例文件mysql_b_test.go(文件名必须是*_b_test.go的类型,*代表要测试的文件名,函数名必须以Benchmark开头如:BenchmarkXxx或Benchmark_xxx)

golang profile

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

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

格式形如:

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 : 将那些运行时间较长的测试用例运行时间缩短

未测试:

https://studygolang.com/articles/5428

Go 中的 5 种高级测试方法 https://studygolang.com/articles/12135?fr=sidebar

最新文章

  1. jQuery使用经验建议
  2. linux下解压war格式的包
  3. [BS-05] init、initWithFrame和initWithCoder的区别
  4. Mongodb 笔记09 备份、部署MongoDB
  5. [原创]Microsoft.AnalysisServices.ManagementDialogs.ServerPropertiesLanguagePanel 的类型初始值设定项引发异常
  6. ENVI/IDL中.sav和.pro文件用法的不同
  7. 7. 稀疏表示之OMP,SOMP算法及openCV实现
  8. CDZSC_2015寒假新人(1)——基础 i
  9. 调度器(scheduler)
  10. Python学习笔记——进阶篇【第九周】———MYSQL操作
  11. QML之使用Loader加载QML组件
  12. RadioGroup+TabHost
  13. [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次
  14. vue指令v-cloak示例解析
  15. Apache Commons介绍(转载)
  16. 啰嗦的 java,简洁的 lombok —— lombok 的使用及简单实现单例模式注解
  17. 修改Windows server 时间同步
  18. 巴塞罗那VS皇家马德里
  19. 一个linux内核编译时遇到的perl语法导致的编译问题解决
  20. VB (空字串)、Null、Empty、与 Nothing 的区别

热门文章

  1. [转载]解决clickonce不支持administer权限问题
  2. 美团网技术团队分享的MySQL索引及慢查询优化教程
  3. Swift “ambiguous use of operator '>'”
  4. Selenium2+python自动化36-判断元素存在【转载】
  5. Swagger 2.0 摘要
  6. Android InputStream转Bitmap
  7. 爬虫框架Scrapy的第一个爬虫示例入门教程
  8. Unity中Instantiate物体失效问题
  9. BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
  10. android studio中timber的配置