Test

我们在日常的工作过程中,自测是不可缺少的,公司还会要求所有的公共方法必须要写单测,在别的语言中,我们如果想要写单测还需要使用到测试框架,但是Go语言中,直接支持测试,并且使用起来非常简单。

比如说我现在写了一个:

  1. // twoSum 给定数组,求两个之和的数组内地址
  2. func twoSum(nums []int, target int) []int {
  3. hashTable := map[int]int{}
  4. for i, x := range nums {
  5. if p, ok := hashTable[target-x]; ok {
  6. return []int{p, i}
  7. }
  8. hashTable[x] = i
  9. }
  10. return nil
  11. }

这个方法是求两数之和的,这个方法是公共方法,现在我需要对这个方法进行单测,我们只需要在同一目录下新建一个以 _test结尾的文件就可以了。

  1. package twoSum
  2. import (
  3. "testing"
  4. )
  5. func TestTwoSum(t *testing.T) {
  6. }

新建一个函数,以Test开头,以刚刚的方法名结尾,参数默认是 testing包中的。

现在我们就可以写测试内容了:

  1. func TestTwoSum(t *testing.T) {
  2. args := []struct {
  3. nums []int
  4. target int
  5. source []int
  6. }{
  7. {[]int{2, 7, 11, 15}, 9, []int{0, 1}},
  8. {[]int{2, 7, 11, 15}, 13, []int{0, 2}},
  9. {[]int{0, 1, 0}, 0, []int{0, 2}},
  10. }
  11. for _, arg := range args {
  12. sum := twoSum(arg.nums, arg.target)
  13. for i, v := range sum {
  14. if arg.source[i] != v {
  15. fmt.Printf("nums:%v,target:%v,right:%v,source:%v", arg.nums, arg.target, sum, arg.source)
  16. }
  17. }
  18. }
  19. }

以上就是测试方法的内容了,这和我们平时写的测试不太一样,是因为这是表格驱动测试。

把输入和输出放到同一个结构体内,然后循环去执行测试,把测试不通过的测试案例输出出来,并且符上正确答案,这种方法更加的直观一点,也更加的方便,在Go语言中我们使用这种方法测试更加的简单一点,别的语言如果使用这测试方法可能全非常的麻烦。

测试代码覆盖率

使用命令go test -coverprofile=c.out 成生代码覆盖率文件。

然后通过 go tool cover -html=c.out查看文件内容:

性能测试

一般我们写完测试代码之后,这个函数的测试工作就算完成了,但是有时当一个函数特别重要时,我还还需要对这个函数进行性能测试,Go语言也对性能测试提供了支持:

  1. func BenchmarkTwoSum(b *testing.B) {
  2. nums := []int{2, 7, 11, 15, 24, 22, 44}
  3. target := 9
  4. source := []int{0, 1}
  5. b.ResetTimer()
  6. for i := 0; i < b.N; i++ {
  7. sum := twoSum(nums, target)
  8. for i, v := range sum {
  9. if source[i] != v {
  10. fmt.Printf("nums:%v,target:%v,right:%v,source:%v", nums, target, sum, source)
  11. }
  12. }
  13. }
  14. }

函数名以Benchmark开头,以要测试的函数名结尾。函数体为测试内容。

  1. b.ResetTimer() // 数据准备完成,从这一行对性能进行统计
  1. b.N // 循环的次数由系统决定

使用命令对函数进行测试:

  1. go test -bench .

以上就是测试内容,一共运行了:31572230 次,每次用时 34.93 ns

当然,有时我们想知道这个函数的性能瓶颈在那我们也可以通过命令来实现:

  1. # 通过命令生成性能测试文件
  2. go test -bench . -cpuprofile cpu.out
  3. # 能过web方式查看性能文件
  4. go tool pprof cpu.out
  5. # 最后输入 web 后会自动弹出网页
  6. web

通过网页我们可以更直观的看到性能瓶颈在那。

如果想要查看性能文件必须提前安装:graphviz


关注公众号,随时获取最新资讯

细节决定成败!

个人愚见,如有不对,恳请斧正!

Golang | 测试与性能调优的更多相关文章

  1. golang测试与性能调优

  2. 【GoLang】golang垃圾回收 & 性能调优

    golang垃圾回收 & 性能调优 参考资料: 如何监控 golang 程序的垃圾回收_Go语言_第七城市 golang的垃圾回收(GC)机制 - 两只羊的博客 - 博客频道 - CSDN.N ...

  3. jmeter之如何减负-实现稳定超高并发测试(性能调优)之正确添加监听器

    jmeter之如何减负-实现稳定超高并发测试(性能调优)在测试过程中,初学者使用工具不当,添加众多监控组件,非常想看到实时报告,跑不了一会,jmeter就卡死,只得重启 下面来总结下如何正确使用jme ...

  4. Java性能调优实践

    1 导论 JVM主要有两类调优标志:布尔标志和附带参数标志 布尔标志:-XX:+FlagName表示开启,­-XX:-FlagName表示关闭. 附带参数标志:-XX:FlagName=somethi ...

  5. Golang性能调优入门

    如何利用golang自带的profile工具进行应用程序的性能调优,前一段时间我做的日志分析系统在线上遇到了一个问题,就是分任务的系统down机了,日志处理延迟了10几个小时,这个时候任务分发系统重启 ...

  6. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  7. golang 性能调优分析工具 pprof(下)

    golang 性能调优分析工具 pprof(上)篇, 这是下篇. 四.net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 d ...

  8. hbase性能调优之压缩测试

    文章概述: 1.顺序写 2.顺序读 3.随机写 4.随机读 5.SCAN数据 0 性能测试工具 hbase org.apache.hadoop.hbase.PerformanceEvaluation ...

  9. Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

随机推荐

  1. svelte组件:Svelte自定义弹窗Popup组件|svelte移动端弹框组件

    基于Svelte3.x自定义多功能svPopup弹出框组件(组件式+函数式) 前几天有分享一个svelte自定义tabbar+navbar组件,今天继续带来svelte自定义弹窗组件. svPopup ...

  2. 如何用Google Drive下载超大型文件

    本文将对「如何下载Google Drive中的超大型文件?」这一问题展开探索和解决. 太长不读:直接看这里 情景与问题 在AI.系统安全等研究领域,一项研究成果的产生需要大量的数据样本进行训练和分析, ...

  3. CPU是海王?聊聊 主/子线程 和 同/异步 的关系

    最近表弟一直在找实习,经常会问我一些问题,有些问题在没有经历过真实工作时是真的不好理解的,所以我开了这个[表弟专栏],专门为找工作的表弟解决一些疑惑. 这篇文章从计算机发展的角度出发,描述为什么计算机 ...

  4. 在微信小程序中使用 echarts 图片-例 折线图

    首先进入echarts官方[https://echarts.apache.org/handbook/zh/get-started/].这边只需要在小程序中简单应用一下echarts折线图 所以不需要把 ...

  5. Mybatis将mapper映射文件配置到recources下

    关于为什么要将Mybatis的mappers.xml文件配置到resources目录下的粗浅看法: (1).使文件目录更加清晰.resources文件目录下通常为配置文件,所以将Mappers.xml ...

  6. Go 语言控制台输入&生成随机数

    Go 语言控制台输入&生成随机数 1. 不同基础类型之间的转化对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化.其中最常用的数值转化函数 ...

  7. _u32定义

    驱动开发的原则: 能用__u32就最好用它,或者用u_int32_t之类的也可以,但不要直接用unsigned int等默认的数据类型.目的是让别人明白,你这个变量占多大内存. 原因: 1.你不能确定 ...

  8. 一个简单的用户态赋值语句,cpu都做了哪些操作

    如int a = 0;这样一个赋值语句,cpu做了哪些操作.

  9. CVE-2015-3337(任意文件读取)

    vulhub漏洞环境搭建: https://blog.csdn.net/qq_36374896/article/details/84102101 启动docker环境 cd vulhub-master ...

  10. Markdown初识及基本使用

    Markdown初识及基本使用 ​ 由Typora编写. 一.初识Markdown 允许人们使用易读易写的纯文本格式编写文档. 是一种轻量级标记语言 编写的文档可以导出 HTML .Word.图像.P ...