Golang 中的可测试示例函数(Example Function)详解

news2024/11/27 10:30:07

Golang 可测试示例含函数 (Example Function)

示例函数类似于单元测试函数,但没有  *testing 类型的参数。编写示例函数也是很容易的:

  1. 创建对应的测试文件:在 Go 项目的源代码目录下创建一个新的文件(和被测代码文件在同一个包),以 _test.go 为后缀名。例如,要测试 net 包中 dial.go 中的方法,在 net 包中创建一个名字为 dial_test.go 或者 net_test.go 或者 example_test.go 文件,和单元测试文件是一样的。
  2. 编写示例函数:在测试文件中,编写一个以 Example 为前缀的函数,后面跟上一个或多个字符或字符组合来标识测试用例的名称(一般使用被测的对象的名称,例如包名称、函数名称、结构体名称等,也可以不跟上任何字符),没有任何参数。
  3. 在方法体中编写使用方式,将内容输出到标准输出。方法体的最后可以添加 “Output:” 或 “Unordered output:” 注释,也可以不添加。如果添加了“Output:”注释,会将输出结果与注释进行精确比较。如果添加了“Unordered output:”注释,也会将输出与注释进行比较,但是会忽略行顺序。没有添加任何 output 注释,示例函数会被编译但不会被执行。

可测试示例含函数示例

以 json 格式校验工具 https://github.com/luduoxin/json-validator-go 为例,validator 包中的 scanner.go 文件中的关键函数 Valid 用于校验给定字符串是否 json 格式,对应的测试文件为 scanner_test.go,里面的示例函数为 ExampleValid,代码如下:

func ExampleValid() {
	fmt.Println(Valid([]byte("{}")))
	// output: true
}

运行看下效果:

=== RUN   ExampleValid
--- PASS: ExampleValid (0.00s)
PASS

看一个有多条输出结果的示例:

func ExampleValid() {
	fmt.Println(Valid([]byte("{}")))
	fmt.Println(Valid([]byte(`a:b`)))
	// output: true
	// false
}

运行看下效果:

=== RUN   ExampleValid
--- PASS: ExampleValid (0.00s)
PASS

看一个 “Unordered output:” 注释的示例:

func ExampleValid() {
	fmt.Println(Valid([]byte("{}")))
	fmt.Println(Valid([]byte(`{"a":"b"}`)))
	// Unordered output: true
	// true
}

运行看下效果:

=== RUN   ExampleValid
--- PASS: ExampleValid (0.00s)
PASS

看一个测试不通过的示例:

func ExampleValid() {
	fmt.Println(Valid([]byte("{}")))
	fmt.Println(Valid([]byte(`{"a":"b"}`)))
	// Unordered output: true
	// false
}

运行看下效果:

=== RUN   ExampleValid
--- FAIL: ExampleValid (0.00s)
got:
true
true

看一个没有 output 注释的示例:

func ExampleValid() {
	fmt.Println(Valid([]byte("{}")))
}

运行 go test 命令,此函数不会被执行。

上面测试通过的示例(运行结果为 PASS 的示例)的通过是什么意思呢?就是在执行示例时,测试框架捕获写入到标准输出的数据,然后与 “output:” 注释中的结果进行比较,如果匹配,则测试通过,否则测试不通过(结果为 FAIL)。

在 Godoc 中的展示

示例函数会在 Godoc 中作为对应函数的示例,看 Golang 官方的一张截图:

 

Godoc 使用命名约定将示例函数与包级标的识符关联起来。约定规则如下:

func ExampleFoo()     // documents the Foo function or type
func ExampleBar_Qux() // documents the Qux method of type Bar
func Example()        // documents the package as a whole

按照这个约定,Godoc 将在 Reverse  函数的文档旁边显示 ExampleReverse 示例。通过使用以下划线开头、后跟小写字母的后缀,可以为指定函数(或者包、结构体、方法等)提供多个示例。如下:

func ExampleReverse()
func ExampleReverse_second()
func ExampleReverse_third()

小结

本文详细讲解了 Golang 中的可测试示例函数, 可以很方便地转换为 Godoc 中可读性很强的文档,这也是 Golang 提倡的代码即文档的一个最佳实践,如果你还没有使用过,赶快使用起来吧。

 

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

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

相关文章

Java 知识合集 | 多线程与并发

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

C++初阶之内存分布

C/C内存管理 C/C内存分布C语言中动态内存管理方式:malloc/calloc/realloc/free1.malloc和free2.calloc3.realloc4.常见的动态内存错误 C内存管理方式1.new/delete操作内置类型2.new和delete操作自定义类型3.new和malloc使用上的区别 operator new与operator delete函…

设计模式: 23重设计模式

设计模式 设计模式概述设计模式的概念设计模式的组成23种设计模式设计模式与软件架构设计模式分类创建型设计模式结构型设计模式行为型设计模式 设计模式概述 在20世纪70年代,Christopher Alexander 提出了城市建筑的模式,他认为:模式是描述…

Windows的内部结构API

Windows内部结构 由于 Windows 机器构成了企业基础设施的大部分,红队需要了解 Windows 的内部结构以及如何(滥用)使用它们。在制作攻击性工具或漏洞利用时,红队可以滥用这些来帮助规避和利用。 进程 进程维护并代表程序的执行&…

Abaqus 中的步进、增量、迭代和尝试概念 硕迪科技

Abaqus 中的步进、增量、迭代和尝试等可能会在概念上让 Abaqus 初学者感到困惑。清楚地了解分析步骤、荷载增量和迭代之间的区别非常重要。在这篇文章中快速了解 Abaqus 步骤和增量迭代。 在ABAQUS中,步进增量迭代是解决非线性问题的一种数值计算方法。这种方法通常…

【分布式】1、CAP 理论 | 一致性、可用性、分区容忍性

文章目录 一、CAP 理论1.1 Consistency 一致性1.2 Availbility 可用性1.3 Partition Tolerance 分区容忍性1.4 CAP 应用1.4.1 CP1.4.2 AP 二、CAP 实践2.1 ACID2.2 BASE 一、CAP 理论 是 2002 年证明的定理,原文,内容如下: In a distributed…

Day52: 84.柱状图中最大的矩形

84.柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣(LeetCode) 思路 本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序是从大到小的顺序。例: 三种情况&a…

安装 VNC 服务器-iTOPRK3588开发板

开发板联网以后,在串口终端输入以下命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install tightvncserver apt-get install xfonts-base 安装完毕之后,在串口终端输入以下命令运行 vnc tightvncserver 然后要求设置密…

算法专题:投票法

文章目录 169.多数元素(找频率>n/2,且多数元素一定存在)思路完整版补充:注意点 面试题 17.10. 主要元素(找频率>n/2,但多数元素不一定存在)思路完整版 229.多数元素Ⅱ(找频率&…

“智能文件批量改名工具:轻松去除文件名中的特殊符号“

您是否曾经为繁杂的文件命名而感到困扰?特殊符号导致文件名混乱难辨,给您的工作和学习带来不便?现在,我们的智能文件批量改名工具为您解决这一难题! 首先,我们要进行文件批量改名高手主页面,并…

基于Docker容器安装TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验…

【iOS】CALayer的理解与简单使用

文章目录 前言一、UIView与CALayer的关系二、CALayer的简单使用1.圆角与裁剪2.contents3.边框属性 总结 前言 在实现网易云音乐demo开发的过程中,通过查阅网上资料,发现了我们可以对我们的视图进行裁剪来实现美观的体现,例如这样&#xff1a…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

【C++杂货铺】拷贝构造函数

📖定义 拷贝构造函数是构造函数的一个重载,它的本质还是构造函数,那就意味着,只有在创建对象的时候,编译器才会自动调用它,那他和普通的构造函数有什么区别呢? 拷贝构造函数,是创建…

Ubuntu系统开发环境搭建和常用软件

目录 安装PHP7.3 安装MySQL5.7 安装Nginx 配置Nginx支持PHP 安装Jetbrains全家桶 将程序加入到桌面和收藏夹 安装Navicat15 安装 redis和客户端工具 截图工具 终端修改 其它软件 当前我的系统是Ubuntu22.04: 安装PHP7.3 如果使用 apt install php 默认应…

一文讲透 Redis 事务 (事务模式 VS Lua 脚本)

准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 脚本。 先说结论: Redis 的事务模式具备如下特点: 保证隔离性; 无法保证持久性; 具备了一定的原子性,但不支持回滚; 一致性的概念有分歧…

BI-SQL丨XML PATH

XML PATH 在SQL Server中,XML数据类型的应用范围是非常宽泛的,除了可以使用value和nodes处理一行拆多行的情况,我们还可以使用PATH处理多行合并成一行。 使用实例 例子:使用PATH处理多行合并成一行。 创建一张表,表…

在vsCode 中执行Electron 项目时,出现中文乱码问题

问题:vscode 中执行Electron 项目时,控制台出现乱码 解决方法: 在 terminal 修改编码格式:65001代表UTF-8,936代表GBK

freeswitch的mod_xml_cdr模块

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯。 fs中的mod_xml_cdr模块提供了基本话单功能之外的选择,可以输出XML格式的本地话单或通…

arm day4

.text .global _start _start: /**********LED1点灯**************/bl rcc_initbl led_initbl led1_initbl led2_initloop:bl led_onbl delay_1sbl led_offbl delay_1sbl led1_onbl delay_1sbl led1_offbl delay_1sbl led2_onbl delay_1sbl led2_offbl delay_1sb looprcc_init…