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://www.mzph.cn/news/57874.shtml

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

相关文章

【IMX6ULL驱动开发学习】11.Linux之SPI驱动

参考:驱动程序开发:SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器(控制器)数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数 二、SPI驱动模板 一、SPI驱动…

718. 最长重复子数组

718. 最长重复子数组 原题链接:完成情况:题解:方法一:动态规划方法二:滑动窗口方法三:二分查找 哈希 原题链接: 718. 最长重复子数组 https://leetcode.cn/problems/maximum-length-of-repe…

Android App的设计规范

Android App 设计规范是为开发者和设计师提供的一系列准则和建议,以确保应用在 Android 设备上的外观、交互和用户体验保持一致。以下是一些常见的 Android App 设计规范要点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开…

Apifox下载安装步骤

我们先访问网址 https://apifox.com/?utm_sourcebaidu&utm_mediumsem&utm_campaign251430236&utm_content7810722111&utm_termapifox%E6%9F%A5%E7%9C%8B%E7%89%88%E6%9C%AC&bd_vid8323327349775096324 然后 这里这个免费下载已经写的这么明显了 那就直接点…

大华摄像头有问题,海康摄像头也有问题

买了个大华摄像头,除了抗噪方面效果不好,我是很满意的。前一段时间摄像头启动出了点问题(忘记拔掉SD卡),于是买了个海康的。 大华摄像头是3寸,海康是2寸。视频效果差多了。看来大有大的道理。更可恨的是&a…

PMO(Project Management Office)

PMO 是项目管理办公室(Project Management Office)的缩写。它是组织内的一个部门或团队,负责支持和促进项目管理活动,以确保项目按时、按预算、按要求完成。 PMO 的职责和角色可以因组织的性质和需求而有所不同,但通常…

java中 while 和 for 两种循环写法的使用场景

目录 场景 能否将声明变量写在while的小括号里? 能否将声明变量写在for的小括号里? 省流: BufferedReader br new BufferedReader(null);for(String line; (line br.readLine()) ! null;){System.out.println(line);}正文: …

c++学习之string实现

字符串 - C引用 (cplusplus.com)这里给出标准官方的string实现,可以看到设计还是较为复杂的,有成员函数,迭代器,修饰符,容量,元素访问,字符串操作等,将字符尽可能的需求都设计出来&a…

Jmeter(三十):并发测试(设置集合点)

集合点:让所有请求在不满足条件的时候处于等待状态。 如:我集合点设置为50,那么不满足50个请求的时候,这些请求都会集合在一起,处于等待状态,当达到50的时候,就一起执行。从而达到并发的效果。 那么Jmeter中可以通过同步定时器 Synchronizing Timer 来完成。 Number …

计算机竞赛 基于机器视觉的手势检测和识别算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

医学影像PACS系统源码,患者登记、图像采集和处理、图像存储、报告产生的影像系统

PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取…

高忆管理:新手炒股入门零基础学?

炒股是一些人为了取得高额回报和更好的财政自由而进行的活动。但对许多新手而言,这是一个全新的领域,需求掌握许多根底常识才能够开始加入炒股商场。本文将为零根底的新手炒股入门供给一些主张和技巧: 一、学习根底常识 关于炒股入门的新手而…

spark内置函数笔记

spark常用的内置函数 一、统计函数 1. approx_percentile selectapprox_percentile( id, array(0.5, 0.7, 0.9), 1000) as res from (select explode(sequence(1,1000)) as id) aa ; [499,699,899] 二、数组函数 1. array -- 构造数据组 select array(1, 2, 3); [1,2,3]-- 数…

在ros中利用串口serial发布fdilink的gps话题

文章目录 介绍FDILink通讯协议数据帧组成数据包 数据处理打开串口在头文件中定义参数串口读取 代码运用依赖:使用: 源码 介绍 DETA100系列 是一个提供 GNSS/INS & AHRS 系统的模组,在最苛刻的条件下提供准确的位置、速度、加速度和姿态数…

Java抽象类——抽象类与普通类的区别

abstract抽象类 1、含义:类和类之间具有共同特征,将这些共同特征提取出来,就形成抽象类。。。 在 java 中,被 abstract 关键字修饰的类叫做抽象类,被abstract关键字修饰的方法叫做抽象方法。 抽象类本身是不存在的&…

量化面试-概率题

文章目录 一、题目1.糖果罐(绿皮书79页)2 折木棍(绿皮书89页)3 第一张ACE(绿皮书95页)4 n个均匀分布之和(绿皮书95页) 二、答案1. 糖果罐2 折木棍3 第一张ACE4 n个均匀分布之和 一、…

spring事件和线程池区别

Spring事件(Spring Event)和线程池(Thread Pool)是两个不同的概念。 Spring事件是Spring框架中的一种机制,用于在应用程序中实现发布-订阅模式。通过定义事件和监听器,可以在特定事件发生时,通…

pytest笔记: pytest单元测试框架

第一步:安装 和查看版本 pycharm settings 查看 第二步: 编写test_example.py def inc(x):return x1 def test_answer():assert inc(4) 5 第三步:在当前路径下执行pytest 命令 PS E:\data\web测试\Selenium3自动化测试实战——基于Pyth…

专题:曲面的切平面、法线

假设曲面方程为隐函数 F ( x , y , z ) 0 ,点 M ( x 0 , y 0 , z 0 ) 是其上一点 又在点 M 处任意引一条在曲面上的曲线,设该曲线参数方程为: { x φ ( t ) y ψ ( t ) z ω ( t ) ,且当 t t 0 时, x x 0 , y y…

Flink流批一体计算(18):PyFlink DataStream API之计算和Sink

目录 1. 在上节数据流上执行转换操作,或者使用 sink 将数据写入外部系统。 2. File Sink File Sink Format Types Row-encoded Formats Bulk-encoded Formats 桶分配 滚动策略 3. 如何输出结果 Print 集合数据到客户端,execute_and_collect…