Go测试之.golden 文件

news2024/9/24 23:30:49

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

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

alt

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


alt

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

alt

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

alt

和断言有何区别?


".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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autosar存储入门系列03_NVM状态机及读写存储调用逻辑

本文框架 0.前言1. NVM状态机介绍2. NVM读/写基本逻辑2.1 NVM读操作2.2 NVM写操作2.2.1 实时写2.2.2 下电写 2.3 NVM写入注意事项 0.前言 本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不…

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时,我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中,go-resty 是一个被广泛使用的 HTTP 客户端。…

还在为Compose组件管理苦恼?Jetpack Compose的版本控制清单(BOM)扫除你的苦恼

还在为Compose组件管理苦恼?Jetpack Compose的版本控制清单(BOM)扫除你的苦恼 Jetpack Compose通过简化和提高效率,彻底改革了Android UI开发。其中一个有助于此的功能是Jetpack Compose版本控制清单(BOM)…

vue2 组件组成部分,组件通信,进阶语法

一、学习目标 1.组件的三大组成部分(结构/样式/逻辑) ​ scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法父传子子传父非父子通信(扩展) 4.进阶语法 v-model原理v-model应用于组件sync修饰符ref和$refs$nextTic…

3、当今的企业架构分析

3、当今的企业架构分析 3、分库分表水平拆分(MySQL集群) 因为一个数据库装不下了,需要分库分表,读写分离,主从复制,主节点M与从节点s组成了一个数据库的集群,组成了一个小的单元,前端…

Axure RP软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Axure RP是Axure公司开发的一款原型设计工具,广泛应用于产品设计和UI/UX设计领域。以下是Axure RP软件的主要特点和功能: 原型设计:Axure RP提供了丰富的界面元素和交互元素,用户…

django的简易的图书管理系统jsp书店进销存源代码MySQL

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 django的简易的图书管理系统 系统有1权限&#xff1a…

使用WebDriver采样器将JMeter与Selenium集成

第一步: 在JMeter中添加Selenium / WebDriver插件 第二步: 创建一条测试计划–添加线程组 添加配置元素 - jpgc - WebDriver Sampler 添加配置元素 - jpgc - Chrome Driver Config 并且添加监听器查看结果树 第三步: 下载 chromedriver…

时序预测 | MATLAB实现Attention-GRU时间序列预测(注意力机制融合门控循环单元,TPA-GRU)

时序预测 | MATLAB实现Attention-GRU时间序列预测----注意力机制融合门控循环单元,即TPA-GRU,时间注意力机制结合门控循环单元 目录 时序预测 | MATLAB实现Attention-GRU时间序列预测----注意力机制融合门控循环单元,即TPA-GRU,时…

煤矿皮带运输智能监控算法 opencv

煤矿皮带运输智能监控算法通过opencvpython深度学习算法网络模型,煤矿皮带运输智能监控算法实时监测皮带运输过程中的各种异常情况,如跑偏、撕裂、堆料异常等,一旦检测到异常情况,立即发出告警并采取相应的措施,以保障…

搭建开发环境-WSL+Ubuntu(一键搭建开发环境)

概述 所谓工欲善其事必先利其器,搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说,很多东西都已经习惯成自然,也就没有刻意和初学者说。但对于很多初学者,却是受益良多。 这个系列,先从操作系统开始…

MySQL数据库——约束(概述、约束演示、外键约束、删除/更新行为)

目录 概述 约束演示 表格创建 验证 图形化界面约束 外键约束 概念 语法 外键删除/更新行为 总结 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中数据。目的:保证数据库中数据的正确、有效性和完整性。分类&#xff1…

有哪些常人不知道的赚钱方法?

在目前互联网时期,如果说还有什么挣钱方法让别人不知道,那一定是赚大钱或者违法乱纪的挣钱渠道。但是对于普通人而言,确实是有一些挣钱的方法不被其了解,我这里就介绍几个,供大家一起探讨。 第一个:知识变…

TCP/IP五层模型、封装和分用

1.网络通信基础2.协议分层OSI七层协议模型TCP/IP五层/四层协议模型【重点】 3. 封装&分用 1.网络通信基础 IP地址:表示计算机的位置,分源IP和目标IP;举个例子:买快递,商家从上海发货,上海就是源IP&…

爱奇艺数据湖实战 - 基于数据湖的日志平台架构演进

01 背景 为了满足公司内日志实时查询分析的需求,爱奇艺大数据团队自研了Venus日志服务平台,负责爱奇艺各服务日志的采集、存储、处理、分析等场景。早期采用基于ElasticSearch的存储分析架构,随着数据规模的不断扩大,出现了成本高…

C语言基础之——指针(上)

前言:小伙伴们又见面啦!本期内容,博主将展开讲解有关C语言中指针的上半部分基础知识,一起学习起来叭!!! 目录 一.什么是指针 二.指针类型 1.指针的解引用 2.指针-整数 三.野指针 1.野指针…

Day46|动态规划part08:139.单词拆分、多重背包理论基础、背包问题总结

139. 单词拆分 leetcode链接:力扣题目链接 视频链接:你的背包如何装满?| LeetCode:139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意:不要…

【Linux】目录结构、路径

目录 1. 目录结构 1.1 基本概念 1.2 具体的目录结构 2. 路径 2.1 绝对路径和相对路径 2.2 特殊路径符 1. 目录结构 1.1 基本概念 Linux的目录结构是一个树形结构。 Windows系统可以拥有多个盘符,如 C盘、D盘、E盘。Linux没有盘符这个概念,只有一…

树莓派自带的GPIO串口输出及输出乱码问题解决方案

可以使用树莓派的UART0进行串口输出,具体连接方法如图所示: 连接后可以使用如下代码发送串口数据: import serial import time# 串口初始化 ser serial.Serial(/dev/serial0, 9600, timeout1) # /dev/serial0 是树莓派上默认的串口设备# 发…

图书馆项目Java阅览室管理系统jsp源代码MySQL

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 图书馆项目 系统有1权限:管理员 用所技术…