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. 使用 Nuxt 3 的 defineRouteRules 进行页面级别的混合渲染

    title: 使用 Nuxt 3 的 defineRouteRules 进行页面级别的混合渲染 date: 2024/8/12 updated: 2024/8/12 author: cmdragon ...

  2. CRC算法原理、推导及实现

    CRC, Cyclic Redundancy Check, 循环冗余校验 1. 基本原理 CRC的本质是除法,把待检验的数据当作一个很大(很长)的被除数,两边选定一个除数(有的文献叫poly),最后得 ...

  3. CVSS(Common Vulnerability Scoring System)打分规则解读

    CVSS(Common Vulnerability Scoring System)提供了一种根据漏洞的主要特征进行打分,反映其严重性的方法.CVSS 已成为被广泛使用的标准. 下面是CVSS 3.1版 ...

  4. MSI Afterburner 使用

    MSI Afterburner 是一款显卡超频软件,同时可以监测硬件运行数据(CPU 温度.GPU 温度.帧率.帧生成时间等).与其捆绑安装的 RivaTuner Statistics Server ...

  5. 开源项目管理工具 Plane 安装和使用教程

    说到项目管理工具,很多人脑海中第一个蹦出来的可能就是 Jira 了.没错,Jira 确实很强大,但是...它也有点太强大了,既复杂又昂贵,而且目前也不再提供私有化部署版本了. 再说说飞书,作为国产之光 ...

  6. 【YashanDB知识库】filter or改写问题

    问题现象 当filter中出现or的时候,会导致filter无法走索引或者走hash join,就需要进行改写,例如: create table test_tab1(col1 int, col2 in ...

  7. C++17: 用折叠表达式实现一个IsAllTrue函数

    前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true. 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C++新特性知识, ...

  8. 开发一个属性名提示友好的Vue组件

    这两天开发了一个组件,开发好之后想着先本地npm link 用一用试试,然后在vue3 项目中link了过来,发现VSCODE没有属性提示,鉴于考虑到一个好的组件应该是提示友好的,于是给组件准备加上属 ...

  9. JS 希尔排序完全理解

    希尔排序的思想直白点来说就是间隔对比,比如说 我有一个数组,长度为9,则第一次分割间隔为长度的1/3 + 1,则第一次对比就是1 比 4,2 比 5, 3 比 6,4 比 7,5 比 8 , 6 比 ...

  10. AI 视觉的应用|ZegoAvatar ⾯部表情随动技术解析

    ​ 一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"." ...