This commit is contained in:
Xargin 2016-10-05 13:29:05 +08:00
parent 99690fd663
commit 54eda31c00
8 changed files with 9 additions and 9 deletions

View File

@ -1,6 +1,6 @@
### 11.2.2. 测试一个命令
对于测试包`go test`是一个有用的工具,但是稍加努力我们也可以用它来测试可执行程序。如果一个包的名字是 main那么在构建时会生成一个可执行程序不过main包可以作为一个包被测试器代码导入。
对于测试包`go test`是一个有用的工具,但是稍加努力我们也可以用它来测试可执行程序。如果一个包的名字是 main那么在构建时会生成一个可执行程序不过main包可以作为一个包被测试器代码导入。
让我们为2.3.2节的echo程序编写一个测试。我们先将程序拆分为两个函数echo函数完成真正的工作main函数用于处理命令行输入参数和echo可能返回的错误。

View File

@ -1,6 +1,6 @@
### 11.2.3. 白盒测试
一种测试分类的方法是基于测试者是否需要了解被测试对象的内部工作原理。黑盒测试只需要测试包公开的文档和API行为内部实现对测试代码是透明的。相反白盒测试有访问包内部函数和数据结构的权限因此可以做到一普通客户端无法实现的测试。例如一个白盒测试可以在每个操作之后检测不变量的数据类型。白盒测试只是一个传统的名称其实称为clear box测试会更准确。
一种测试分类的方法是基于测试者是否需要了解被测试对象的内部工作原理。黑盒测试只需要测试包公开的文档和API行为内部实现对测试代码是透明的。相反白盒测试有访问包内部函数和数据结构的权限因此可以做到一普通客户端无法实现的测试。例如一个白盒测试可以在每个操作之后检测不变量的数据类型。白盒测试只是一个传统的名称其实称为clear box测试会更准确。
黑盒和白盒这两种测试方法是互补的。黑盒测试一般更健壮随着软件实现的完善测试代码很少需要更新。它们可以帮助测试者了解真实客户的需求也可以帮助发现API设计的一些不足之处。相反白盒测试则可以对内部一些棘手的实现提供更多的测试覆盖。

View File

@ -25,7 +25,7 @@ $ go list -f={{.GoFiles}} fmt
{% endraw %}
TestGoFiles表示的是fmt包内部测试测试代码以_test.go为后缀文件名不过只在测试时被构建
TestGoFiles表示的是fmt包内部测试代码以_test.go为后缀文件名不过只在测试时被构建
{% raw %}

View File

@ -203,7 +203,7 @@ $ go test gopl.io/ch11/word2
ok gopl.io/ch11/word2 0.015s
```
这种表格驱动的测试在Go语言中很常见。我们可以很容易地向表格添加新的测试数据并且后面的测试逻辑也没有冗余这样我们可以有更多的精力完善错误信息。
这种表格驱动的测试在Go语言中很常见。我们可以很容易地向表格添加新的测试数据并且后面的测试逻辑也没有冗余这样我们可以有更多的精力完善错误信息。
失败测试的输出并不包括调用t.Errorf时刻的堆栈调用信息。和其他编程语言或测试框架的assert断言不同t.Errorf调用也没有引起panic异常或停止测试的执行。即使表格中前面的数据导致了测试的失败表格后面的测试数据依然会运行测试因此在一个测试中我们可能了解多个失败的信息。

View File

@ -2,7 +2,7 @@
就其性质而言测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过“测试能证明缺陷存在而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下测试可以增强我们的信心代码在很多重要场景下是可以正常工作的。
对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法来帮助我们编写有效的测试代码。
对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法来帮助我们编写有效的测试代码。
这些启发式方法中,语句的覆盖率是最简单和最广泛使用的。语句的覆盖率是指在测试中至少被运行一次的代码占总代码数的比例。在本节中,我们使用`go test`命令中集成的测试覆盖率工具,来度量下面代码的测试覆盖率,帮助我们识别测试和我们期望间的差距。
@ -89,7 +89,7 @@ $ go tool cover -html=c.out
![](../images/ch11-03.png)
绿色的代码块被测试覆盖到了,红色的则表示没有被覆盖到。为了清晰起见,我们将背景红色文本的背景设置成了阴影效果。我们可以马上发现unary操作的Eval方法并没有被执行到。如果我们针对这部分未被覆盖的代码添加下面的测试用例然后重新运行上面的命令那么我们将会看到那个红色部分的代码也变成绿色了
绿色的代码块被测试覆盖到了红色的则表示没有被覆盖到。为了清晰起见我们将背景红色文本的背景设置成了阴影效果。我们可以马上发现unary操作的Eval方法并没有被执行到。如果我们针对这部分未被覆盖的代码添加下面的测试用例然后重新运行上面的命令那么我们将会看到那个红色部分的代码也变成绿色了
```
{"-x * -x", eval.Env{"x": 2}, "4"}

View File

@ -1,6 +1,6 @@
## 11.5. 剖析
测量基准(Benchmark)对于衡量特定操作的性能是有帮助的但是当我们试图让程序跑的更快的时候我们通常并不知道从哪里开始优化。每个码农都应该知道Donald Knuth在1974年的“Structured Programming with go to Statements”上所说的格言。虽然经常被解读为不重视性能的意思但是从原文我们可以看到不同的含义
基准测试(Benchmark)对于衡量特定操作的性能是有帮助的但是当我们试图让程序跑的更快的时候我们通常并不知道从哪里开始优化。每个码农都应该知道Donald Knuth在1974年的“Structured Programming with go to Statements”上所说的格言。虽然经常被解读为不重视性能的意思但是从原文我们可以看到不同的含义
> 毫无疑问对效率的片面追求会导致各种滥用。程序员会浪费大量的时间在非关键程序的速度上实际上这些尝试提升效率的行为反倒可能产生很大的负面影响特别是当调试和维护的时候。我们不应该过度纠结于细节的优化应该说约97%的场景:过早的优化是万恶之源。
>

View File

@ -16,7 +16,7 @@ func ExampleIsPalindrome() {
根据示例函数的后缀名部分godoc这个web文档服务器会将示例函数关联到某个具体函数或包本身因此ExampleIsPalindrome示例函数将是IsPalindrome函数文档的一部分Example示例函数将是包文档的一部分。
示例文档的第二个用处是,在`go test`执行测试的时候也会运行示例函数测试。如果示例函数内含有类似上面例子中的`// Output:`格式的注释,那么测试工具会执行这个示例函数,然后检查示例函数的标准输出与注释是否匹配。
示例函数的第二个用处是,在`go test`执行测试的时候也会运行示例函数测试。如果示例函数内含有类似上面例子中的`// Output:`格式的注释,那么测试工具会执行这个示例函数,然后检查示例函数的标准输出与注释是否匹配。
示例函数的第三个目的提供一个真实的演练场。 http://golang.org 就是由godoc提供的文档服务它使用了Go Playground让用户可以在浏览器中在线编辑和运行每个示例函数就像图11.4所示的那样。这通常是学习函数使用或Go语言特性最快捷的方式。

View File

@ -10,4 +10,4 @@ Maurice Wilkes第一个存储程序计算机EDSAC的设计者1949年他在
Go语言的测试技术是相对低级的。它依赖一个go test测试命令和一组按照约定方式编写的测试函数测试命令可以运行这些测试函数。编写相对轻量级的纯测试代码是有效的而且它很容易延伸到基准测试和示例文档。
在实践中,编写测试代码和编写程序本身并没有多大区别。我们编写的每一个函数也是针对每个具体的任务。我们必须小心处理边界条件,思考合适的数据结构,推断合适的输入应该产生什么样的结果输出。编测试代码和编写普通的Go代码过程是类似的它并不需要学习新的符号、规则和工具。
在实践中,编写测试代码和编写程序本身并没有多大区别。我们编写的每一个函数也是针对每个具体的任务。我们必须小心处理边界条件,思考合适的数据结构,推断合适的输入应该产生什么样的结果输出。编测试代码和编写普通的Go代码过程是类似的它并不需要学习新的符号、规则和工具。