瀏覽代碼

翻译13.6

dake 10 年之前
父節點
當前提交
4207e28a11
共有 3 個文件被更改,包括 82 次插入1 次删除
  1. 79 1
      eBook/13.7.md
  2. 2 0
      eBook/13.8.md
  3. 1 0
      eBook/directory.md

+ 79 - 1
eBook/13.7.md

@@ -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)

+ 2 - 0
eBook/13.8.md

@@ -0,0 +1,2 @@
+# 13.8 测试的具体例子
+

+ 1 - 0
eBook/directory.md

@@ -132,6 +132,7 @@
     - 13.5 [一种用闭包处理错误的模式](13.5.md)
     - 13.6 [启动外部命令和程序](13.6.md)
     - 13.7 [Go 中的单元测试和基准测试](13.7.md)
+    - 13.8 [测试的具体例子](13.8.md)
 - 第14章:goroutine 与 channel
 - 第15章:网络、模版与网页应用