Go测试之.golden文件使用示例详解

 更新时间:2023年08月28日 09:14:57   作者:好文收藏  
这篇文章主要为大家介绍了Go测试之.golden文件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Go测试中的.golden 文件是干什么用的?

举例说明

在Go语言中,.golden文件通常用于测试中的黄金文件(golden files)。黄金文件是在测试期间记录预期输出结果的文件。测试用例运行时,黄金文件用于比较实际输出与预期输出是否一致。

通常,".golden" 文件的命名规则是将测试文件的名称与 ".golden" 后缀相结合,例如,如果测试文件为 "foo_test.go",则相应的 ".golden" 文件可能被命名为 "foo_test.golden"。

在测试期间,如果测试输出与 ".golden" 文件的内容匹配,则测试被认为是通过的。否则,测试将失败并显示差异信息,以帮助开发人员确定测试失败的原因。

需要注意的是,".golden" 文件不应该包含敏感信息,因为这些文件通常被包含在源代码仓库中,并且可能会被共享或分发给其他人。

".golden" 文件的命名并没有一个官方规定的标准,但是根据一些 Go 语言社区的约定,".golden" 文件通常被命名为 ".golden" 是因为这个后缀在文件名中很不常见,因此可以很容易地与其他文件进行区分。

此外,一些人认为 ".golden" 这个名称的来源可能与软件测试中的“黄金数据”(Golden Data)有关。在软件测试中,“黄金数据”指的是已知正确的数据,用于验证软件是否按照预期运行。因此,将测试期望输出与已知正确的数据进行比较,与软件测试中使用的“黄金数据”进行比较是相似的。这种类比可能也是 ".golden" 文件名称的一个来源。

举个例子,假设你正在编写一个函数来格式化一个字符串,并且你想要编写相应的测试用例。你可以创建一个黄金文件来保存预期的输出结果。在测试运行时,测试代码将生成实际的输出结果并将其与黄金文件中的预期结果进行比较。如果实际输出与预期输出匹配,测试将被标记为通过。如果不匹配,测试将被标记为失败,以便你可以检查代码的更改是否是有意的。

示例

假设你有一个名为formatter.go的文件,其中包含一个FormatString函数用于格式化字符串。你还有一个测试文件formatter_test.go,其中包含一个测试用例来测试FormatString函数。

在测试文件中,你可以创建一个黄金文件expected_output.golden,其中包含你期望的输出结果。然后,你的测试用例可以读取这个黄金文件,调用FormatString函数,生成实际的输出,并将其与黄金文件中的预期结果进行比较。

// formatter.go
package main
import "fmt"
func FormatString(s string) string {
    return fmt.Sprintf("Formatted: %s", s)
}
// formatter_test.go
package main
import (
    "io/ioutil"
    "testing"
)
func TestFormatString(t *testing.T) {
    input := "Hello, World!"
    expectedOutput, err := ioutil.ReadFile("expected_output.golden")
    if err != nil {
        t.Fatalf("Failed to read golden file: %v", err)
    }
    actualOutput := FormatString(input)
    if string(actualOutput) != string(expectedOutput) {
        t.Errorf("Unexpected output:\nExpected: %s\nActual: %s", expectedOutput, actualOutput)
    }
}

在这个例子中,测试代码读取expected_output.golden文件,它的内容可以是Formatted: Hello, World!。然后,测试用例调用FormatString函数并将其输出与黄金文件中的预期结果进行比较。如果两者不匹配,测试将失败并输出相应的错误消息。

使用黄金文件可以有效地验证代码的输出是否与预期一致,并提供了一种可持续的方式来更新测试结果。如果你对FormatString函数进行了更改,你只需验证黄金文件是否需要相应地更新,而无需手动更新所有测试用例的预期输出。

测试

# command-line-arguments [command-line-arguments.test]
./formatter_test.go:15:18: undefined: FormatString

需要对 运行/调试设置做如下修改

同时需要先执行 go mod init golden 和 go mod tidy,否则上图会提示 错误: 找不到软件包 golden

新建 expected_output.golden,如果什么内容也不写入,执行单测:

即 需要将预期的内容写到expected_output.golden中,最后会做一个比较

和断言有何区别?

".golden" 文件和断言是测试中两个不同的概念,它们有一些相似之处,但也有一些区别。

断言是在测试代码中使用的一种机制,用于检查代码的行为是否符合预期。测试代码中通常会使用断言来检查一些条件是否为真,如果条件不满足,则测试将失败。例如,在 Go 语言中,可以使用 assert 包中的 Equal 函数来检查两个值是否相等。

与断言不同,".golden" 文件通常用于测试输出或结果是否与预期的输出或结果匹配。测试代码会生成一些输出或结果,然后与预期的输出或结果进行比较,如果匹配,则测试通过,否则将测试失败。".golden" 文件是预期输出或结果的一种形式,测试代码会将其与实际输出或结果进行比较,以确定测试是否通过。

因此,断言和".golden" 文件是测试中两种不同的机制,它们用于检查不同的测试条件。断言通常用于检查代码的行为是否符合预期,而 ".golden" 文件通常用于测试输出或结果是否与预期的输出或结果匹配。

(其实和直接在断言里写预期的字符串效果类似,但写文件,更适用于内容较多的case吧; 或者Go官方没有提供断言,一般的项目都使用第三方的 github.com/stretchr/testify/assert)

“黄金文件”这个概念,在其他编程语言中有吗?

虽然 "黄金文件" 这个特定术语在其他编程语言中可能不常见,但类似的概念在其他语言和测试框架中也存在。这些概念可能被称为 "参考文件"、"预期输出文件"、"基准文件" 或 "固定输出文件",具体取决于使用的语言和框架。

下面是一些示例:

  • Python Unittest:在Python的unittest框架中,可以使用 assertMultiLineEqual() 方法来比较实际输出和参考文件中的内容。参考文件可以是文本文件或其他格式的文件。
  • Java JUnit:在Java的JUnit测试框架中,你可以将预期输出作为字符串或文件提供给断言方法,然后将实际输出与其进行比较。这类似于使用黄金文件进行比较。
  • C++ Catch2:Catch2是一个流行的C++测试框架。你可以使用 REQUIRE_THAT() 或其他类似的宏来比较实际输出与预期输出。在这种情况下,预期输出可以是一个字符串或文件。

尽管不同的编程语言和测试框架可能使用不同的术语,但它们都提供了一种机制来验证实际输出与预期输出之间的一致性。这种机制有助于确保代码的行为符合预期,并提供一种可持续的方式来更新测试结果。

以上就是Go测试之.golden文件使用示例详解的详细内容,更多关于Go .golden测试文件的资料请关注脚本之家其它相关文章!

相关文章

  • 浅析Golang中类型嵌入的简介与使用

    浅析Golang中类型嵌入的简介与使用

    类型嵌入指的就是在一个类型的定义中嵌入了其他类型,Go 语言支持两种类型嵌入,分别是接口类型的类型嵌入和结构体类型的类型嵌入,下面我们就来详细一下类型嵌入的使用吧
    2023-11-11
  • 使用VSCODE配置GO语言开发环境的完整步骤

    使用VSCODE配置GO语言开发环境的完整步骤

    Go语言是采用UTF8编码的,理论上使用任何文本编辑器都能做Go语言开发,大家可以根据自己的喜好自行选择,下面这篇文章主要给大家介绍了关于使用VSCODE配置GO语言开发环境的完整步骤,需要的朋友可以参考下
    2022-11-11
  • Go语言中的iota关键字的使用

    Go语言中的iota关键字的使用

    这篇文章主要为大家详细介绍了Go语言中的iota关键字的相关使用,文中的示例代码讲解详细,对我们深入了解Go语言有一定的帮助,需要的可以参考下
    2023-08-08
  • Go实现自动解压缩包以及读取docx/doc文件内容详解

    Go实现自动解压缩包以及读取docx/doc文件内容详解

    在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件,需要的可以参考一下
    2023-03-03
  • 详解go程序如何在windows服务中开启和关闭

    详解go程序如何在windows服务中开启和关闭

    这篇文章主要介绍了一个go程序,如何在windows服务中优雅开启和关闭,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端

    Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端

    pipeline 模式的 redis 客户端需要有两个后台协程负责 tcp 通信,调用方通过 channel 向后台协程发送指令,并阻塞等待直到收到响应,本文是使用 golang 实现 redis 系列的第六篇, 将介绍如何实现一个 Pipeline 模式的 Redis 客户端。
    2021-07-07
  • Golang 并发下的问题定位及解决方案

    Golang 并发下的问题定位及解决方案

    由于 gin-swagger 是并发执行的, 输出的日志本身是错位,这就导致无法定义是哪一个结构体缺少 tag 导致的,这篇文章主要介绍了Golang 并发下的问题定位及解决方案,需要的朋友可以参考下
    2022-03-03
  • Golang配置管理库 Viper的教程详解

    Golang配置管理库 Viper的教程详解

    这篇文章主要介绍了Golang 配置管理库 Viper,使用 viper 能够很好的去管理你的配置文件信息,比如数据库的账号密码,服务器监听的端口,你可以通过更改配置文件去更改这些内容,而不用定位到那一段代码上去,提高了开发效率,需要的朋友可以参考下
    2022-05-05
  • golang使用RSA加密和解密的实现示例

    golang使用RSA加密和解密的实现示例

    在Golang中RSA加密和解密是一个常见的操作,本文主要介绍了golang使用RSA加密和解密的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Go语言实现栈与队列基本操作学家

    Go语言实现栈与队列基本操作学家

    go语言中,并没有栈与队列相关的数据结构,但是我们可以借助切片来实现栈与队列的操作;接下来我们一起实现栈与队列基本操作,感兴趣的可以了解一下
    2022-11-11

最新评论