Go-知识测试-Main测试

Go-知识测试-Main测试

  • [1. 定义](#1. 定义)
  • [2. 使用](#2. 使用)
  • [3. 原理](#3. 原理)

建议先看:https://blog.csdn.net/a18792721831/article/details/140062769

Go-知识测试-工作机制

1. 定义

声明一个func TestMain(m *testing.M),名字比较特殊的测试,参数类型为test.M指针。

如果声明了一个这样的测试,那么当前测试程序不是直接执行各项测试,而是将测试交给TestMain调度。

2. 使用

Go 复制代码
func TestFunc1(t *testing.T) {
	fmt.Println(t.Name())
}

func TestFunc2(t *testing.T) {
	fmt.Println(t.Name())
}

func BenchmarkFunc1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fmt.Println(b.Name())
	}
}

func ExampleFunc1() {
	fmt.Println("ExampleFunc1")
}

func TestMain(m *testing.M) {
	fmt.Println("TestMain setup")
	resCode := m.Run()
	fmt.Println("TestMain teardown")
	os.Exit(resCode)
}

使用go test -v执行

如果所有测试均通过测试,则 m.Run 返回0,如果 m.Run 返回1,则代表测试失败。

TestMain 执行时,命令行参数还未解析,如果测试程序需要依赖参数,则可以使用 flag.Parse 解析参数。

m.Run 方法内部还会再次解析参数,并且此处解析参数不会影响测试过程。

3. 原理

每种测试(单元测试,性能测试或示例测试)都有一个数据类型与其对应。

单元测试: InternalTest

性能测试: InternalBenchmark

示例测试: InternalExample

在测试编译阶段,每个测试都会被放到指定类型的切片中,测试执行时,这些测试会被放到testing.M

数据结构中进行调度。testing.M是MainTest对应的数据结构类型

testing.M在src/testing/testing.go中定义:

Go 复制代码
type M struct {
	deps       testDeps // 测试路径
	tests      []InternalTest // 单元测试
	benchmarks []InternalBenchmark // 性能测试
	examples   []InternalExample // 示例测试
	timer     *time.Timer // 测试超时时间
	afterOnce sync.Once // 执行结束的数据汇总
	numRun int // 执行次数
	exitCode int // 执行结果
}

单元测试,性能测试和示例测试在经过编译后会被存放到一个testing.M数据结构中,

在测试执行时,该数据结构将传递给TestMain,真正执行测试的是testing.M的Run方法。

timer用于指定测试的超时时间,可以通过参数-timeout 指定,当测试执行超时后会立即结束并判定为失败。

TestMain函数有一个m.Run方法,该方法会执行单元测试、性能测试和示例测试,如果用户实现了TestMain但是没有调用m.Run,

那么什么测试都不会被执行。

m.Run不仅会执行测试,还会做一些初始化工作,比如解析参数,启动定时器,根据参数指示创建一系列的文件等。

更多详细信息:https://blog.csdn.net/a18792721831/article/details/140062769

相关推荐
有代理ip1 天前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
天远云服1 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
女王大人万岁1 天前
Go标准库 sync 详解
服务器·开发语言·后端·golang
小高Baby@1 天前
session、cookie、Jwt-token
开发语言·后端·golang
Grassto1 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
小二·1 天前
Go 语言系统编程与云原生开发实战(第12篇)云原生部署实战:Helm Chart × GitOps × 多环境管理(生产级落地)
开发语言·云原生·golang
天空属于哈夫克31 天前
Go 语言实战:构建一个企微外部群“技术贴收藏夹”小程序后端
小程序·golang·企业微信
小二·1 天前
Go 语言系统编程与云原生开发实战(第13篇)工程效能实战:Monorepo × 依赖治理 × 构建加速(10万行代码实测)
开发语言·云原生·golang
暴躁小师兄数据学院1 天前
【WEB3.0零基础转行笔记】Golang编程篇-第4讲:Go语言中的流程控制
开发语言·后端·golang·web3·区块链
lingggggaaaa2 天前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法