关于后端:Go测试之golden-文件

72次阅读

共计 3088 个字符,预计需要花费 8 分钟才能阅读完成。

Go 测试中的.golden 文件是干什么用的?请举例说明

在 Go 语言中,.golden文件通常用于测试中的黄金文件(golden files)。黄金文件是在测试期间记录预期输入后果的文件。测试用例运行时,黄金文件用于比拟理论输入与预期输入是否统一。

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

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

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

<font size=1 color=”orange”>

“.golden” 文件的命名并没有一个官网规定的规范,然而依据一些 Go 语言社区的约定,”.golden” 文件通常被命名为 “.golden” 是因为这个后缀在文件名中很不常见,因而能够很容易地与其余文件进行辨别。

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

</font>

举个例子,假如你正在编写一个函数来格式化一个字符串,并且你想要编写相应的测试用例。你能够创立一个黄金文件来保留预期的输入后果。在测试运行时,测试代码将生成理论的输入后果并将其与黄金文件中的预期后果进行比拟。如果理论输入与预期输入匹配,测试将被标记为通过。如果不匹配,测试将被标记为失败,以便你能够查看代码的更改是否是无意的。

以下是一个示例:

假如你有一个名为 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 goldengo mod tidy,否则上图会提醒 谬误: 找不到软件包 golden

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

即 须要将预期的内容写到 expected_output.golden 中,最初会做一个比拟

和断言有何区别?

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

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

与断言不同,”.golden” 文件通常用于测试输入或后果是否与预期的输入或后果匹配。测试代码会生成一些输入或后果,而后与预期的输入或后果进行比拟,如果匹配,则测试通过,否则将测试失败。”.golden” 文件是预期输入或后果的一种模式,测试代码会将其与理论输入或后果进行比拟,以确定测试是否通过。

因而,断言和 ”.golden” 文件是测试中两种不同的机制,它们用于查看不同的测试条件。断言通常用于查看代码的行为是否合乎预期,而 “.golden” 文件通常用于测试输入或后果是否与预期的输入或后果匹配。

(其实和间接在断言里写预期的字符串成果相似,但写文件,更实用于内容较多的 case 吧; 或者 Go 官网没有提供断言,个别的我的项目都应用第三方的 github.com/stretchr/testify/assert)

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

尽管 “ 黄金文件 ” 这个特定术语在其余编程语言中可能不常见,但相似的概念在其余语言和测试框架中也存在。这些概念可能被称为 “ 参考文件 ”、” 预期输入文件 ”、” 基准文件 ” 或 “ 固定输入文件 ”,具体取决于应用的语言和框架。

上面是一些示例:

  1. Python Unittest:在 Python 的 unittest 框架中,能够应用 assertMultiLineEqual() 办法来比拟理论输入和参考文件中的内容。参考文件能够是文本文件或其余格局的文件。
  2. Java JUnit:在 Java 的 JUnit 测试框架中,你能够将预期输入作为字符串或文件提供给断言办法,而后将理论输入与其进行比拟。这相似于应用黄金文件进行比拟。
  3. C++ Catch2:Catch2 是一个风行的 C ++ 测试框架。你能够应用 REQUIRE_THAT() 或其余相似的宏来比拟理论输入与预期输入。在这种状况下,预期输入能够是一个字符串或文件。

只管不同的编程语言和测试框架可能应用不同的术语,但它们都提供了一种机制来验证理论输入与预期输入之间的一致性。这种机制有助于确保代码的行为合乎预期,并提供一种可继续的形式来更新测试后果。

本文由 mdnice 多平台公布

正文完
 0