Golang 单元测试

这篇具有很好参考价值的文章主要介绍了Golang 单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

单元测试是通过编写测试函数来完成的,这些函数位于_test.go文件中

步骤

要创建一个单元测试,你需要遵循以下步骤:

  1. 在与要测试的代码相同的包中创建一个新的文件,文件名以_test.go结尾
  2. 导入testing
  3. 编写测试函数,函数名以Test开头,接受一个*testing.T类型的参数
  4. 在测试函数内部,使用testing.T的方法如Error, Fail, 或 Errorf 来报告失败
  5. 要运行测试,则需打开终端,切换到包含_test.go文件的目录,并运行go test命令,Go 测试工具会自动查找当前目录(或指定包路径)中所有以 _test.go 结尾的文件,执行其中的测试函数

在运行测试命令时,如果目录包括非ASCII字符(如中文字符),那么需要显式指定源文件和测试文件
类似测试指定路径,如:

go test my/package/path

多个则用空格隔开

子测试(t.Run)

子测试(subtests)是一种将相关测试组织在单个测试函数中的方式。这在你想用不同参数或配置运行一组测试时非常有用。下面是一个使用子测试的例子:

func TestAdd(t *testing.T) {
    // 定义一系列测试用例
    testCases := []struct {
        name     string
        a, b     int // 输入参数
        expected int // 期望结果
    }{
        {"两个正数相加", 1, 2, 3},
        {"两个负数相加", -1, -2, -3},
        {"正负数相加", -1, 1, 0},
    }

    // 遍历测试用例
    for _, tc := range testCases {
        // 使用t.Run()定义子测试
        t.Run(tc.name, func(t *testing.T) {
            result := Add(tc.a, tc.b) // 调用待测试的函数
            // 断言:结果是否与期望值相符
            if result != tc.expected {
                t.Errorf("Add(%d, %d) 结果为 %d; 期望值为 %d", tc.a, tc.b, result, tc.expected)
            }
        })
    }
}

在此示例中,t.Run() 用于为每个测试用例定义一个子测试。每个子测试都有一个名称和执行测试的函数。这允许你在测试输出中看到哪些子测试通过或失败。使用 go test 命令结合 -run 标志,你还可以单独运行子测试。

如果你的测试函数中有多个子测试,你可以使用 -run 标志来指定要运行的特定测试或子测试。例如,如果你只想运行名为 “两个正数相加” 的子测试,可以这样做:

go test -run TestAdd/两个正数相加

TestMain函数

如果你需要在测试前设置一些全局状态或者在所有测试运行完后执行清理工作,可以使用TestMain函数。这个函数应该在你的测试文件中定义,并且只能定义一次。它允许你控制测试的运行方式,包括手动调用测试函数。

TestMain函数通常接受一个*testing.M参数,并且没有返回值。它可以调用m.Run()来启动测试,该方法将返回一个状态码,通常会将这个状态码作为参数传递给os.Exit来结束程序。

以下是TestMain的使用示例:

package mypackage

import (
    "os"
    "testing"
)

func setup() {
    // 在测试运行前执行的代码
}

func teardown() {
    // 在所有测试运行完后执行的代码
}

func TestMain(m *testing.M) {
    setup()
    // 执行测试
    code := m.Run()
    teardown()
    // 退出程序
    os.Exit(code)
}

setup函数会在任何测试运行之前执行,而teardown函数则在所有测试完成后执行。m.Run()在setup和teardown之间调用,它实际上运行所有的测试函数。然后,你可以使用它的返回值作为参数传递给os.Exit,以正确地设置程序的退出状态码。

如果你的测试文件中定义了TestMain,Go的测试运行器将调用这个函数而不是直接运行测试函数。这给了你更多的控制权,但同时也意味着你必须显式调用m.Run()来确保测试的执行

go test 常见用法

  • 运行特定的测试函数:
go test -run TestName

其中 TestName 是要运行的测试函数的名称。支持正则表达式,例如 -run 'TestAdd$' 只会运行 TestAdd 测试函数

  • 显示测试覆盖率:
go test -cover

这会输出测试的覆盖率统计信息

  • 生成测试覆盖率文件
go test -coverprofile=coverage.out

创建一个名为 coverage.out 的文件,其中包含覆盖率数据

  • 查看覆盖率报告
go tool cover -html=coverage.out

会打开一个网页,显示详细的覆盖率报告

  • 运行带有详细输出的测试
go test -v

-v 标志将会输出每个测试函数的名称和运行结果

  • 运行特定的测试包
go test ./...

使用 ./… 运行当前目录及其所有子目录中的测试

  • 运行基准测试
go test -bench .

-bench 参数可以接受一个正则表达式,用来指定要运行的基准测试函数名称

  • 设置测试时的环境变量
go test -env "FOO=bar"

这将在测试运行时设置环境变量 FOO 的值为 bar文章来源地址https://www.toymoban.com/news/detail-792304.html

  • 并行运行测试
go test -parallel n
  • 这些选项可以结合使用,以适应你的具体测试需求
    例如,你可以同时运行所有测试,显示详细输出并获取覆盖率报告:
go test -v -coverprofile=coverage.out ./...

到了这里,关于Golang 单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过Mock玩转Golang单元测试!

    如果项目中没有单元测试,对于刚刚开始或者说是规模还小的项目来说,效率可能还不错。但是一旦项目变得复杂起来,每次新增功能或对旧功能的改动都要重新手动测试一遍所有场景,费时费力,而且还有可能因为疏忽导致漏掉一些覆盖不到的点。在这个基础上,单元测试

    2024年02月05日
    浏览(40)
  • GoLang 单元测试打桩和 mock

    目录 什么是 mock 变量打桩 接口方法/Redis 函数/方法打桩 包函数 成员方法 MySQL sqlmock sqlite mock gorm http mock 源码地址 单测基础        单元测试,顾名思义对某个单元函数进行测试,被测函数本身中用到的变量、函数、资源不应被测试代码依赖,所谓 mock,就是想办法通过 “虚

    2024年02月02日
    浏览(39)
  • 使用vscode写golang的一些大坑(单元测试、goimports、接口实现)

    之前使用的是goland,定位代码、代码补全、代码测试、git版本管理一应俱全,使用方便,但是奈何内存占用太大,平时使用的的项目又比较多,所以决定转战vscode。 在使用vscode开发的过程,目前碰到了三个问题: 查看源码时,无法根据接口定义查找到所有的实现。 goland的

    2024年02月06日
    浏览(42)
  • Golang单元测试与Goroutine详解 | 并发、MPG模式及CPU利用

    深入探讨Golang中单元测试方法及Goroutine的使用。了解并发与并行概念,MPG模式以及CPU相关函数的应用。解决协程并行中的资源竞争问题。

    2024年02月10日
    浏览(42)
  • Golang 测试工具 go test

    go test 本身可以携带很多的参数,熟悉这些参数,可以让我们的测试过程更加方便。 math_test.go math.go 是一对,缺一不可,前后顺序可对调。 -run 支持正则,如下例子中 TestAdd ,如果还有一个测试函数为 TestAdd02 ,那么它也会被运行。 准备两个 Go 文件:: E:TEXTtest_gotestmathmat

    2024年02月07日
    浏览(44)
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或错误,特别是容易被忽视的边界情况。模糊测试的基本思路是在测试过程中生成大量的随机数,然后将这些数据输入

    2024年02月07日
    浏览(39)
  • golang 工程组件:grpc-gateway 环境安装+默认网关测试

    grpc-gateway 顾名思义是专门是grpc的网关。也是一个protobuf的编译器,是一个proto的插件。 grpc-gateway就是将http请求处理后转发到对应grpc服务上。很多浏览器,或者客户端开箱不支持grpc,只支持传统的restful API。 grpc网关而且也支持负载,兼容不同版本。 官方文档 grpc-gateway 源码

    2024年02月08日
    浏览(43)
  • 【Golang】解决Go test执行单个测试文件提示未定义问题

    目录 背景 根本原因 解决方法 解决 多级引用或多个引用包的情况 总结  资料获取方法 很多人记录过怎么执行Go test单个文件或者单个函数,但是要么对执行单文件用例存在函数或变量引用的场景避而不谈,要么提示调用了其它文件中的模块会报错。其实了解了go test命令的机

    2024年02月14日
    浏览(39)
  • [保姆教程] Windows平台OpenCV以及它的Golang实现gocv安装与测试(亲测通过)

    一、下载安装 MinGW CMake 预备步骤 首先打开cmd: 下载安装MinGW64 访问: https://sourceforge.net/projects/mingw-w64/files/ 下载: MinGW-W64 GCC-8.1.0 下面的 x86_64-posix-seh 版本 下载后,将它解压缩到 c:mingw64 里 下载安装 CMake 访问:https://cmake.org/download/ 下载:Windows x64 ZIP 解压到: c:cmake Window

    2024年02月09日
    浏览(72)
  • 【Golang】Golang进阶系列教程--Golang中文件目录操作的实现

    Golang中,文件是指计算机中存储数据的实体,文件可以是文本文件、二进制文件、配置文件等。在Go语言中,通过操作文件,我们可以读取文件的内容,写入数据到文件,以及获取文件的属性等。 Golang中的文件可以分为两种类型:文本文件和二进制文件。文本文件是指只包含

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包