关于go语言的测试相关内容笔记

其实之前对于测试自己一直比较弱,不管是python的还是go的,关于测试这块并没有非常注重,这次就好好整理一下关于go的测试

单元测试

Go程序主要包含三类测试: 功能测试(test)、基准测试(benchmark,也称性能测试)以及示例测试

这里提一下,示例测试其实也是一种功能测试,只不过它更关注程序打印出来的内容

一般情况下:一个测试赛源码文件只会针对某个命令源码文件, 或库源码文件做测试,所以我们应该把它们放在同一个代码包内

测试源码文件的主名称应该以被测试源码文件的主名称为前导, 并且必须以“_test”为后缀,如被测试的源码文件名是demo.go 那么测试源码文件名是demo_test.go

Go 语言对测试函数的名称和签名都有哪些规定?

  1. 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只有一个*testing.T 类型的参数声明
  2. 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型
  3. 对于实例测试函数来说,其名称必须以Example为前缀, 但对函数的参数列表没有强制规

关于go test 命令的主要流程是:

go test 命令在开始运行时会先做一些准备工作,比如,确定内部需要用到的命令,检查我们指定的代码包或源码文件的有效性,以及判断我们基于的标记是否合法等等

在准备工作完成后,go test 命令会针对每个测试代码包依次进行构建,执行包中符合要求的测试函数,清理临时文件,打印测试结果。

这里的依次:表示对每个测试代码包,go test 命令会串行的执行测试流程中的每个步骤。但是为了加快测试速度,它通常会并发地对多个被测试代码包进行功能测试。只不过最后打印测试结果的时候

会按照我们给定的顺序逐个进行,让我们感觉是在串行的执行测试

由于并发测试会让性能测试的结果存在偏差,所以性能测试一般都是串行进行的

go test -v 可以看到测试中更详细的日志信息

如果想要某个测试在执行的过程中立即失败,可以在该函数中调用:t.FailNow方法

怎么解释性能测试的测试结果?

这个还是非常重要的,之前并没有去细致的了解

这里有一段代码,并为之写了一个性能测试代码内容如下:

package demo54

import "math"

func GetPrimes(max int) []int {
    if max <= 1 {
        return []int{}
    }
    marks := make([]bool, max)
    var count int
    squareRoot := int(math.Sqrt(float64(max)))
    for i := 2; i <= squareRoot; i++ {
        if marks[i] == false {
            for j := i * i; j < max; j += i {
                if marks[j] == false {
                    marks[j] = true
                    count++
                }
            }
        }
    }
    primes := make([]int, 0, max-count)
    for i := 2; i < max; i++ {
        if marks[i] == false {
            primes = append(primes, i)
        }
    }
    return primes
}

性能测试的代码为:

package demo54

import "testing"

func BenchmarkGetPrimes(b *testing.B) {
    for i:=0;i<b.N;i ++ {
        GetPrimes(1000)
    }
}

下面是测试命令和结果

zhaofan@zhaofandeMacBook-Pro  ~/go_project  go test -bench=. -run=^$ 36/demo54
goos: darwin
goarch: amd64
pkg: 36/demo54
BenchmarkGetPrimes-4      500000              2728 ns/op
PASS
ok      36/demo54       1.407s

这里对这个命令进行解释:

第一个标记-bench=. 只有有了这个标记命令才会进行性能测试,该标记. 表明需要执行任意名称的性能测试函数,当然这里还是要符合Go程序测试的基本规则的

第二个标记及值是-run=^$ 这个标记用于表明需要执行哪些功能测试函数,这同样是以函数名称为依据的 该标记的值^$ 意味着只执行名称为空的功能测试函数,其实就是不执行任何功能测试函数

结果中:BenchmarkGetPrimes-4 被称为单个性能测试的名称,表示命令执行了性能测试函数BenchmarkGetPrimes 并且当时所有最大的P 数量为4 最大P 数量相当于可以同时运行goroutine的逻辑CPU的最大个数。这里的CPU可以被称为CPU核心,但他并等同于计算机中真正的CPU核心

go test -cpu 可以设置最大P数量的列表

关于测试代码的解释:

func BenchmarkGetPrimes(b *testing.B) {
    for i:=0;i<b.N;i ++ {
        GetPrimes(1000)
    }
}

这里在一个会循环迭代b.N次方的循环中调用了GetPrimes函数,并传递的参数为1000, go test 命令会先尝试把b.N 设置为1,

然后执行测试函数

如果测试的函数执行时间没有超过上限, 此伤心啊默认为1秒,那么命令就会改大b.N的值,然后再次执行测试函数,如此往复,知道这个时间大于或等于上限为止。

当某次执行的时间大于或等于上限时, 我们就说这事命令此次对该测试函数的最后一次执行,这时b.N的值就会包含在测试结果中,也就是上述测试结果中的500000

结果中:2728 ns/op 表明单次执行GetPrimes函数的平均耗时为2728纳秒。 这其实就是最后一次执行测试函数的时间,除以被测函数的执行测试得出的结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

HTTP POST GET 本质区别详解

    一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交

2521
来自专栏腾讯云TStack专栏

对象存储,了解一下

? 对象存储,通常指 S3 (Simple Storage Service) 服务,由AWS提供公有云服务,而 Ceph 也可以提供兼容 S3 协议的对象存储...

6152
来自专栏架构说

关于 liunx select/recv函数返回值理解

今天遇到下面问题 如果socket客户端进程挂点 或者正常close 服务端检测 select检测返回的是0 还是-1 还是大于1呀 这个基本问题 竟然我分...

3955
来自专栏专注数据中心高性能网络技术研发

关于eventfd,epoll,线程间通信小记

先介绍eventfd 1 #include<sys/eventfd.h> 2 int eventfd(unsigned int initval, int fla...

3617
来自专栏网络

Nginx 教程#1:基本概念

协作翻译 原文:Nginx Tutorial #1: Basic Concepts 链接:https://www.netguru.co/codestories/...

2318
来自专栏Python中文社区

Django博客教程(五):处理 http 请求完全解读

專 欄 ❈追梦人物,Python中文社区专栏作者。电子科技大学计算机学院研究生,从事大数据分析研究方向。主要使用 Python 语言进行相关数据的分析,熟练使...

28010
来自专栏开发与安全

linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识

       每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在...

2366
来自专栏Flutter入门到实战

一行代码快速解耦Application逻辑,让Application更简洁好维护

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/23b9ba9b685d

823
来自专栏北京马哥教育

Python爬虫基础知识:urllib2的使用技巧

糖豆贴心提醒,本文阅读时间6分钟 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节。 1.Proxy 的设置 urllib2 默认...

2985
来自专栏张戈的专栏

Shell脚本的简单排错法及调试程序bashdb

Jboss 的研究稍有卡壳,那就来点基础教程好了。 与众多脚本语言一样,Shell 脚本在执行时出错是很常见的,最简单的原因无外乎脚本在编写的过程中出现了语法错...

3866

扫码关注云+社区