• Go-知识测试-Main测试


    Go-知识测试-Main测试

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

    Go-知识测试-工作机制

    1. 定义

    声明一个func TestMain(m *testing.M),名字比较特殊的测试,参数类型为test.M指针。
    如果声明了一个这样的测试,那么当前测试程序不是直接执行各项测试,而是将测试交给TestMain调度。

    2. 使用

    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中定义:

    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

  • 相关阅读:
    go语言基本操作--四
    序列化反射filter添加Neo-reGeorg内网代理
    Web Audio API 第1章 基础篇
    Postman下发流表至Opendaylight
    鸿蒙Next怎么升级,有便捷的方法?
    算法:(三)字符串
    ModBus TCP/RTU 报文解析
    Spring面向切面编程(AOP)
    vue:使用:element 中弹框中获取table高度无效
    加速大数据分析:Apache Kylin使用心得与最佳实践详解
  • 原文地址:https://blog.csdn.net/a18792721831/article/details/140094681