# testing - 运行并验证示例 #
testing 包除了测试,还提供了运行并验证示例的功能。示例,一方面是文档的效果,是关于某个功能的使用例子;另一方面,可以被当做测试运行。
一个示例的例子如下:
```go
func ExampleHello() {
fmt.Println("Hello")
// Output: Hello
}
```
如果 `Output: Hello` 改为:`Output: hello`,运行测试会失败,提示:
```
got:
Hello
want:
hello
```
一个示例函数以 Example 开头,如果示例函数包含以 "Output" 开头的行注释,在运行测试时,go 会将示例函数的输出和 "Output" 注释中的值做比较,就如上面的例子。
有时候,输出顺序可能不确定,比如循环输出 map 的值,那么可以使用 "Unordered output" 开头的注释。
如果示例函数没有 "Output" 注释,该示例函数只会被编译而不会被运行。
## 命名约定
Go 语言通过大量的命名约定来简化工具的复杂度,规范代码的风格。对示例函数的命名有如下约定:
- 包级别的示例函数,直接命名为 `func Example() { ... }`
- 函数 F 的示例,命名为 `func ExampleF() { ... }`
- 类型 T 的示例,命名为 `func ExampleT() { ... }`
- 类型 T 上的 方法 M 的示例,命名为 `func ExampleT_M() { ... }`
有时,我们想要给 包/类型/函数/方法 提供多个示例,可以通过在示例函数名称后附加一个不同的后缀来实现,但这种后缀必须以小写字母开头,如:
```
func Example_suffix() { ... }
func ExampleF_suffix() { ... }
func ExampleT_suffix() { ... }
func ExampleT_M_suffix() { ... }
```
通常,示例代码会放在单独的示例文件中,命名为 `example_test.go`。可以查看 `io` 包中的 `example_test.go` 了解示例的编写。
## 实现原理
本节开头提到了示例的两个作用,它们分别是由 `godoc` 和 `go test` 这两个命令实现的。
在执行 `go test` 时,会运行示例。具体的实现原理,可以通过阅读 `go test` 命令源码和 testing 包中 `example.go` 文件了解。
# 导航 #
- 上一节:[testing - 子测试与子基准测试](09.3.md)
- 下一节:[testing - 其他功能](09.5.md)
- 简介
- 第一章 输入输出 (Input/Output)
- 1.1 io — 基本的 IO 接口
- 1.2 ioutil — 方便的 IO 操作函数集
- 1.3 fmt — 格式化 IO
- 1.4 bufio — 缓存 IO
- 第二章 文本
- 2.1 strings — 字符串操作
- 2.2 bytes — byte slice 便利操作
- 2.3 strconv — 字符串和基本数据类型之间转换
- 2.4 regexp — 正则表达式
- 2.5 unicode — Unicode 码点、UTF-8/16 编码
- 第三章 数据结构与算法
- 3.1 sort — 排序算法
- 3.2 index/suffixarray — 后缀数组实现子字符串查询
- 3.3 container — 容器数据类型:heap、list 和 ring
- 第四章 日期与时间
- 4.1 主要类型概述
- 4.2 时区
- 4.3 Time类型详解
- 4.4 定时器
- 第六章 文件系统
- 6.1 os — 平台无关的操作系统功能实现
- 6.2 path/filepath — 操作路径
- 第七章 数据持久存储与交换
- 7.1 database/sql — SQL/SQL-Like 数据库操作接口
- 第八章 数据压缩与归档
- 8.1 flate * DEFLATE 压缩算法
- 第九章 测试
- 9.1 testing * 单元测试
- 9.2 testing * 基准测试
- 9.3 testing * 子测试
- 9.4 testing * 运行并验证示例
- 9.5 testing * 其他功能
- 9.6 httptest * HTTP 测试辅助工具
- 9.7 总结
- 第十章 进程、线程与 goroutine
- 10.1 创建进程
- 10.2 进程属性和控制
- 10.3 线程
- 10.4 进程间通信
- 第十三章 应用构建 与 debug
- 13.1 flag * 命令行参数解析
- 13.2 log * 日志记录
- 13.3 expvar * 公共变量的标准化接口
- 13.4 runtime/debug * 运行时的调试工具