forked from unknwon/the-way-to-go_ZH_CN
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
dake
committed
Nov 8, 2015
1 parent
725f2b5
commit 4207e28
Showing
3 changed files
with
82 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,79 @@ | ||
# 13.7 Go 中的单元测试和基准测试 | ||
# 13.7 Go 中的单元测试和基准测试 | ||
|
||
首先所有的包都应该有一定的必要文档,然后同样重要的是对包的测试。 | ||
|
||
在第 3 章中提到了 Go 的测试工具 gotest, 我们已经在 9.8 节中使用过了。这里我们会用更多的例子进行详细说明。 | ||
|
||
名为 testing 的包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能。 | ||
|
||
<u>备注:</u>gotest 是 Unix bash 脚本,所以在 Windows 下你需要配置 MINGW 环境(参见 2.5 节);在 Windows 环境下把所有的 pkg/linux_amd64 替换成 pkg/windows。 | ||
|
||
对一个包做(单元)测试,需要写一些可以频繁(每次更新后)执行的小块测试单元来检查代码的正确性。于是我们必须写一些 Go 源文件来测试代码。测试程序必须属于被测试的包,并且文件名满足这种形式 `*_test.go`,所以测试代码和包中的业务代码是分开的。 | ||
|
||
_test 程序不会被普通的 Go 编译器编译,所以当放应用部署到生产环境时它们不会被部署;只有 gotest 会编译所有的程序:普通程序和测试程序。 | ||
|
||
测试文件中必须导入 "testing" 包,并写一些名字以 `TestZzz` 打头的全局函数,这里的 `Zzz` 是被测试函数的字母描述,如 TestFmtInterface,TestPayEmployees 等。 | ||
|
||
测试函数必须有这种形式的头部: | ||
|
||
```go | ||
func TestAbcde(t *testing.T) | ||
``` | ||
|
||
T 是传给测试函数的结构类型,用来管理测试状态,支持格式化测试日志,如 t.Log,t.Error,t.ErrorF 等。在函数的结尾把输出跟想要的结果对比,如果不等就打印一个错误。成功的测试则直接返回。 | ||
|
||
用下面这些函数来通知测试失败: | ||
|
||
1)```func (t *T) Fail()``` | ||
|
||
标记测试函数为失败,然后继续执行(剩下的测试)。 | ||
|
||
2)```func (t *T) FailNow()``` | ||
|
||
标记测试函数为失败并中止执行;文件中别的测试也被略过,继续执行下一个文件。 | ||
|
||
3)```func (t *T) Log(args ...interface{})``` | ||
args 被用默认的格式格式化并打印到错误日志中。 | ||
4)```func (t *T) Fatal(args ...interface{})``` | ||
|
||
结合 先执行 3),然后执行 2)的效果。 | ||
|
||
运行 go test 来编译测试程序,并执行程序中所有的 TestZZZ 函数。如果所有的测试都通过会打印出 PASS。 | ||
|
||
gotest 可以接收一个或多个函数程序作为参数,并指定一些选项。 | ||
|
||
结合 --chatty 或 -v 选项,每个执行的测试函数以及测试状态会被打印。 | ||
|
||
例如: | ||
|
||
```bash | ||
go test fmt_test.go --chatty | ||
=== RUN fmt.TestFlagParser | ||
--- PASS: fmt.TestFlagParser | ||
=== RUN fmt.TestArrayPrinter | ||
--- PASS: fmt.TestArrayPrinter | ||
... | ||
|
||
``` | ||
|
||
testing 包中有一些类型和函数可以用来做简单的基准测试;测试代码中必须包含以 `BenchmarkZzz` 打头的函数并接收一个 `*testing.B` 类型的参数,比如: | ||
|
||
```go | ||
func BenchmarkReverse(b *testing.B) { | ||
... | ||
} | ||
|
||
``` | ||
|
||
命令 ```go test –test.bench=.*``` 会运行所有的基准测试函数;代码中的函数会被调用 N 次(N是非常大的数,如 N = 1000000),并展示 N 的值和函数执行的平均时间,单位为 ns(纳秒,ns/op)。如果是用 testing.Benchmark 调用这些函数,直接运行程序即可。 | ||
|
||
具体可以参见 14.16 节中用 goroutines 运行基准测试的例子以及练习 13.3:string_reverse_test.go | ||
|
||
|
||
## 链接 | ||
|
||
- [目录](directory.md) | ||
- 上一节:[启动外部命令和程序](13.6.md) | ||
- 下一节:[测试的具体例子](13.8.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# 13.8 测试的具体例子 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters