• 简介
  • 数据结构
  • 执行测试

    简介

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

    • 单元测试:InternalTest
    • 性能测试:InternalBenchmark
    • 示例测试:InternalExample

    测试编译阶段,每个测试都会被放到指定类型的切片中,测试执行时,这些测试将会被放到testing.M数据结构中进行调度。

    而testing.M即是MainTest对应的数据结构。

    数据结构

    源码src\testing/testing.go:M定义了testing.M的数据结构:

    1. // M is a type passed to a TestMain function to run the actual tests.
    2. type M struct {
    3. tests []InternalTest // 单元测试
    4. benchmarks []InternalBenchmark // 性能测试
    5. examples []InternalExample // 示例测试
    6. timer *time.Timer // 测试超时时间
    7. }

    单元测试、性能测试和示例测试在经过编译后都会被存放到一个testing.M数据结构中,在测试执行时该数据结构将传递给TestMain(),真正执行测试的是testing.M的Run()方法,这个后面我们会继续分析。

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

    执行测试

    TestMain()函数通常会有一个m.Run()方法,该方法会执行单元测试、性能测试和示例测试,如果用户实现了TestMain()但没有调用m.Run()的话,那么什么测试都不会被执行。

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

    m.Run()使用三个独立的方法来执行三种测试:

    • 单元测试:runTests(m.deps.MatchString, m.tests)
    • 性能测试:runExamples(m.deps.MatchString, m.examples)
    • 示例测试:runBenchmarks(m.deps.ImportPath(), m.deps.MatchString, m.benchmarks)其中m.deps里存放了测试匹配相关的内容,暂时先不用关注。