Go 语言推荐测试文件和源代码文件放在同一目录下,测试文件以 _test.go 结尾。比如,当前 package 有 calc.go 一个文件,我们想测试 calc.go 中的 Add 和 Mul 函数,那么应该新建 calc_test.go 作为测试文件。

example/
|--calc.go
|--calc_test.go

假如 calc.go 的代码如下:

1 package main
2
3 func Add(a int, b int) int {
4 return a + b
5 }
6
7 func Mul(a int, b int) int {
8 return a * b
9 }

那么 calc_test.go 中的测试用例可以这么写:

 1 package main
2
3 import "testing"
4
5 func TestAdd(t *testing.T) {
6 if ans := Add(1, 2); ans != 3 {
7 t.Errorf("1 + 2 expected be 3, but %d got", ans)
8 }
9
10 if ans := Add(-10, -20); ans != -30 {
11 t.Errorf("-10 + -20 expected be -30, but %d got", ans)
12 }
13 }
  • 测试用例名称一般命名为 Test 加上待测试的方法名。
  • 测试用的参数有且只有一个,在这里是 t *testing.T

运行 go test,该 package 下所有的测试用例都会被执行。

$ go test
ok example 0.009s

或 go test -v,  -v 参数会显示每个用例的测试结果

$ go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestMul
--- PASS: TestMul (0.00s)
PASS
ok example 0.007s

如果只想运行其中的一个用例,例如 TestAdd,可以用 -run 参数指定,该参数支持通配符 *,和部分正则表达式,例如 ^$

1 $ go test -run TestAdd -v
2 === RUN TestAdd
3 --- PASS: TestAdd (0.00s)
4 PASS
5 ok example 0.007s

遇到如下报错的解决方法

原因:

从提示:build failed可以看出是构建失败,go test与其他的指定源码文件进行编译或运行的命令程序一样(参考:go rungo build),会为指定的源码文件生成一个虚拟代码包——“command-line-arguments”,对于运行这次测试的命令程序来说,测试源码文件getinfo_test.go是属于代码包“command-line-arguments”的,可是它引用了其他包中的数据并不属于代码包“command-line-arguments”,编译不通过,错误自然发生了。

解决方法:

知道了原因之后,解决的方法就出来了,执行命令时加入这个测试文件需要引用的源码文件在命令行后方的文件都会被加载到command-line-arguments中进行编译,示例如下:

单元测试覆盖率

- cover:查看单元测试的覆盖率

- coverprofile:指定输出文件

示例:

生成html格式的覆盖率报告

命令:

go tool cover -html=cover.out -o coverage.html

HTML文件内容:

go test命令的使用

go test做性能测试

除了可以做功能逻辑的测试(上面讲的单元测试),go test还可以做性能测试

压测文件的规则:

  • 文件名规则和单元测试一样
  • 压力测试函数必须遵循如下格式,其中XXX可以是任意字母数字的组合,但是首字母不能是小写字母,注意琪参数是 testing.B,单元测试参数是 testing.T

func BenchmarkXXX(b *testing.B) { … }

  • go test不会默认执行压力测试的函数,如果要执行压力测试需要带上参数-bench,语法:-bench=文件路径名,例如go test -test.bench=.

表示测试当前目录下全部的压力测试函数

  • 压力测试函数在压力测试用例中,有一个属性 testing.B.N,它表示的是进行压力测试的次数。可以通过 b.N = 1234 设置压力次数

如 webbench_test.go 压力测试函数

 1 package math
2
3 import (
4 "testing"
5 )
6
7 func Benchmark_Division(b *testing.B) {
8 for i := 0; i < b.N; i++ { //use b.N for looping
9 Division(4, 5)
10 }
11 }
12
13 func Benchmark_TimeConsumingFunction(b *testing.B) {
14 b.StopTimer() //调用该函数停止压力测试的时间计数
15
16 //做一些初始化的工作,例如读取文件数据,数据库连接之类的,
17 //这样这些时间不影响我们测试函数本身的性能
18
19 b.StartTimer() //重新开始时间
20
21 b.N=1234 //自定义执行1234次
22
23 for i := 0; i < b.N; i++ {
24 Division(4, 5)
25 }
26 }

执行如下命令 go test -v ./webbench_test.go ./division.go -bench=".*" 只显示压力测试,因为两个文件有依赖所以需要放到一起编译执行

其中 -bench=".*" 表示 执行所有压力测试函数

结果如下:

$ go test -v ./webbench_test.go ./division.go  -bench=".*"
goos: linux
goarch: amd64
Benchmark_Division-8 2000000000 0.74 ns/op
Benchmark_TimeConsumingFunction-8 1234 0.96 ns/op
PASS
ok command-line-arguments 1.558s

上面信息说明Benchmark_Division默认执行了2000000000次,

而Benchmark_TimeConsumingFunction通过设置 b.N=1234 执行不同次数;

每次的执行平均时间分别是0.74纳秒和0.96纳秒,总运行时间1.558秒

Go语言单元测试的执行的更多相关文章

  1. c语言单元测试框架--CuTest

    1.简介 CuTest是一款微小的C语言单元测试框,是我迄今为止见到的最简洁的测试框架之一,只有2个文件,CuTest.c和CuTest.h,全部代码加起来不到一千行.麻雀虽小,五脏俱全,测试的构建. ...

  2. C语言单元测试

    转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...

  3. 《分布式对象存储》作者手把手教你写 GO 语言单元测试!

    第一部分:如何写Go语言单元测试 Go语言内建了单元测试(Unit Test)框架.这是为了从语言层面规范写UT的方式. Go语言的命名规则会将以_test.go结尾的go文件视作单元测试代码. 当我 ...

  4. C语言可以在执行语句中间定义变量吗?

    C语言可以在执行语句中间定义变量吗? 例如:for(int i=0; i<5; i++){                                                     ...

  5. Go语言单元测试与基准测试

    目录 单元测试 概述 go test参数解读 单元测试日志 基准测试 基础测试基本使用 基准测试原理 自定义测试时间 测试内存 控制计时器 Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码 ...

  6. C语言单元测试框架--EmbedUnit

    1.简介 Embedded Unit是个纯标准c构建的单元测试框架,主要用在嵌入式c的单体测试上,其主要特点是不依赖于任何C的标准库,所有的对象都是静态分配. 最早这个项目托管在SourceForge ...

  7. pychrame更换默认以unittest执行或取消单元测试框架执行

    选择某个测试框架运行脚本 File-> Settings -> Tools -> Python Integrated Tools -> Default test runner ...

  8. 【30天自制操作系统】day04:C语言与目前执行流程图

    用 C 语言直接写入内存 原来依靠汇编 void io_hlt(void); void write_mem8(int addr, int data); void HariMain(void){ int ...

  9. unitest单元测试TestCase 执行测试用例(一)

    前言 unittest单元测试框架不仅可以适用于单元测试,还可以适用自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. uni ...

  10. 编译C语言单元测试框架CUnit库的方法

    引用: http://blog.csdn.net/yygydjkthh/article/details/46357421 个人备忘使用 /******************************* ...

随机推荐

  1. CentOS ssh版本升级

    1.升级openssl yum install perl wget https://goodrain-delivery.oss-cn-hangzhou.aliyuncs.com/fuzhoushuch ...

  2. 蓝松SDK版本更新至【4.8.0】

    [Android更新] 1. android增加低精度模型,一些低端机也可以流畅抠图. 2. android针对直播机硬件做了特定API,并C语言开源. 3. 视频编辑引出帧解码图层, 允许外界异步形 ...

  3. github拉取项目执行npm i 失败的问题

    一般卡在core-js没反应,然后报错的第一行是和node-sass有关的,基本上都是node-sass版本问题,这时候只需要在命令行输入两行代码就行 先把原来的依赖删掉 npm uni node-s ...

  4. 【YashanDB知识库】手动停止统计信息自动收集任务导致的性能变差

    [问题分类]功能使用 [关键字]统计信息收集 [问题描述]UAT对外演示环境因统计信息收集任务引起数据库整理性能变慢无应急处理手段 [问题原因分析] ● DROP_JOB程序用于删除一个非执行状态下的 ...

  5. 【基础知识】【转】彻底搞懂 async & defer

    普通 script 先来看一个普通的 script 标签. <script src="a.js"></script> 浏览器会做如下处理 停止解析 docu ...

  6. DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning for Noisy Time Series》(时间序列、对比学习、去噪)

    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI 2024出来了,找了几篇论文看,首先这是第一篇. 论文:Denoising-Aware Contrastive Le ...

  7. Axios——异步框架

    Axios--异步框架(简化AJAX代码书写)    Axios 请求方式别名   

  8. 系统编程-进程-当fork遇到管道,可能碰撞出什么?

    第一部分 1. 直接上代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> int globv ...

  9. Vue3——集成 sass

    安装 sass npm install sass sass-loader -D 使用 scss 语法!!!需要加上 lang="scss" <style scoped lan ...

  10. LeetCode 730. Count Different Palindromic Subsequences (区间DP)

    题意 给一个字符串S,求它所有子序列中不同非空回文串的数量.字符串由 'a' 'b' 'c' 'd' 四个字母组成. 由于题目要求的是不同回文串. abba 的回文串子序列为 a,b,aba,abba ...