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

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

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://xiahunao.cn/news/1617790.html

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

相关文章

【js案例】滚动效果实现及简单动画函数抽离

目录 🌟效果 🌟实现思路 🌟实现方法 HTML&CSS代码 初始化 滚动效果 完整JS代码 🌟抽离动画函数 函数的简单使用 小案例一 小案例二 🌟效果 🌟实现思路 要实现自动滚动,无非就…

[转载]田雪松硬笔行书临文征明《滕王阁序》_拔剑-浆糊的传说_新浪博客

原文地址:田雪松硬笔行书临文征明《滕王阁序》 作者:游目骋怀

【Acwing285】没有上司的舞会(树形dp)题目笔记

题目描述 题目分析 首先来看状态表示: f[u][1]:所有从以u为根的子树中选择,并且不选u这个点的情况之下的最大指数 f[u][0]:所有从以u为根的子树中选择,并且选择u这个点的情况之下的最大指数 然后看状态计算&#x…

leetcode 516. 最长回文子序列

2023.8.27 本题依旧使用dp算法做&#xff0c;可以参考 回文子串 这道题。dp[i][j]定义为&#xff1a;子串s[i,j] 的最长回文子串。 直接看代码: class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int&…

pandas由入门到精通-描述性统计量

pandas基础介绍-命令模版 描述性统计量pandas 统计函数相关与协方差唯一值&#xff0c;频次统计,成员关系1. Series.unique()2. Series/DataFrame/array.value_counts()3. Series.isin()4. get_indexer() 索引对应转换 本文介绍pandas中一些常用的描述性统计量相关知识&#xf…

网易 腾讯 新浪手机新闻客户端横向对比评测

这段时间关于iPhone新闻客户端的事件获得不少关注&#xff0c;一张截图对比在微博上四处转发&#xff0c;不过只有一个界面对比也说明不了问题吧&#xff0c;想知道这些新闻客户端是不是如此相似&#xff0c;还是要认真对比瞧瞧。 参赛选手&#xff1a;网易新闻/腾讯新闻/掌中…

乔布斯女儿嘲讽iPhone 14没新意;高德打车AR实景找车功能上线;Go语言报告:错误处理仍然是个挑战|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

极客日报:iPhone卫星功能仅用于紧急通信;韩国通过立法禁止苹果、谷歌垄断支付系统;Linux 5.14 版本发布

一分钟速览新闻点&#xff01; 小米集团加入开源专利社区 OIN饿了么&#xff1a;延长扬州会员一个月的权益阿里云教育推出钉钉课后服务系统华为 P50 Pro 推送鸿蒙更新淘宝更换新的 Slogan 为“淘宝太好逛了吧”鸿蒙 OS 2 升级用户破 7000 万&#xff01;近 100 款机型可升级网…

jQuery Mobile开发的新闻阅读器,适应iphone和android手机

程序员都很赖&#xff0c;你懂的&#xff01; 我们经常上新浪&#xff0c;腾讯&#xff0c;雅虎等各大网站上面看新闻&#xff0c;他们也都各自推出了自家的手机新闻阅读器。今天我自己使用jQuery Mobile 来实现这一功能。图片大小上传限制了大小250*400先看看iphone上的效果&a…

递归算法学习——全排列

目录 ​编辑 一&#xff0c;问题描述 1.例子&#xff1a; 题目接口&#xff1a; 二&#xff0c;问题分析和解决 1.问题分析 2.解题代码 一&#xff0c;问题描述 首先我们得来先看看全排列的问题描述。全排列问题的问题描述如下&#xff1a; 给定一个不含重复数字的数组 n…

2023年流行编曲软件哪个好用?flstudio有免费的吗 flstudio免费插件都有哪些

2023年流行的主流宿主编曲软件哪个好用&#xff0c;现在几款流行的主流宿主编曲软件包括FL Studio、Cubase、Pro Tools、Sonar、Logic Pro、Studio One等等。 对于新手学习来说我个人更推荐FL Studio 21&#xff0c;为什么说FL Studio 21 适合新手呢&#xff1f;自然是有道理的…

免费音频转换器,畅享音乐无边界。这些软件助你一键转换

嘿&#xff01;你是否有过这样的经历&#xff0c;当你想在特定设备上播放自己珍藏的音频时&#xff0c;却发现文件格式不兼容而无法播放&#xff1f;别灰心&#xff0c;我有个小秘诀要告诉你——音频格式转换&#xff01;通过将音频文件转换为适当的格式&#xff0c;你可以轻松…

Harbor 私有仓库迁移博客

文章目录 一.私有仓库迁移的介绍1.为何要对Harbor 私有仓库的迁移2.Harbor 私有仓库的迁移特点3. Harbor 私有仓库的迁移注意要点 二.私有仓库迁移配置1.源Harbor配置&#xff08;192.168.198.11&#xff09;&#xff08;1&#xff09;接着以下操作查看容器状况及是否可以登录 …

语言基础篇1——Python概述,Python是什么?Python能干什么?

概述 简介 Python&#xff0c;计算机高级语言&#xff0c;读作/ˈpaɪθən/&#xff08;英音&#xff09;、/ˈpaɪθɑːn/&#xff08;美音&#xff09;&#xff0c;意为蟒蛇&#xff0c;Python的logo为两条缠绕的蟒蛇 特点 Python以开发效率高而运行效率低著称 应用领域…

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

2023最新任务悬赏平台源码uniapp+Thinkphp新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机

新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机制 后端是&#xff1a;thinkphpFastAdmin 前端是&#xff1a;uniapp 1.优化首页推荐店铺模块如有则会显示此模块没有则隐藏。 2修复首页公告&#xff0c;更改首页公告逻辑。&#xff08;后台添加有公…

【SpringBoot学习笔记02】静态资源

Spring Boot 通过 MVC 的自动配置类 WebMvcAutoConfiguration 为这些 WebJars 前端资源提供了默认映射规则&#xff0c;部分源码如下。 jar包&#xff1a; JAR 文件就是 Java Archive File&#xff0c;顾名思意&#xff0c;它的应用是与 Java 息息相关的&#xff0c;是 Java 的…

msvcp140.dll丢失的解决方法,win10系统dll报错的解决方法

今天&#xff0c;我将为大家分享一个关于msvcp140.dll丢失的解决方法&#xff0c;特别是针对在Windows 10系统上遇到这个问题的朋友们。在开始之前&#xff0c;我想先简要介绍一下msvcp140.dll文件的作用。msvcp140.dll是Microsoft Visual C运行时库的一部分&#xff0c;它包含…

Python功能制作之简单的绘画板

可能需要安装的库 pip install pillow pip install tk制作 我们使用Python的Tkinter库创建的一个简单绘画软件。 首先创建了一个简单的绘画应用&#xff0c;可以选择颜色、切换画笔和橡皮擦模式、清空画布以及绘制自由曲线。 里面的主要结构和功能是&#xff1a; 导入必要的…

WICC 2021 技术分论坛 “开箱即用”语聊房Demo成亮点

7月24日&#xff0c;第三届全球互联网通信云大会(WICC 2021)在北京成功召开&#xff0c;数千开发者共赴通信云技术盛宴。本次会议中&#xff0c;“开发者服务生态”被作为重要议题引起了全产业链的广泛关注。作为大会主办方&#xff0c;全球互联网通信云领导厂商融云不但提出了…