- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
11.7.1 编程测试代码
在这节,您将了解怎样给一个存在的 Go 应用写测试,它有俩个函数:一个是计算斐波纳切数,一个是计算一个字符串长度。使用这俩个函数的主要原因是比较简单,它们实现了相对琐碎的任务。琐碎点是每个函数有俩个不同的实现:一个工作的很好,另一个有些问题。
这个例子 Go 包命名为 testMe
,并存为 testMe.go
。这个包的代码将分为三部分来介绍。
testMe.go
的第一部分代码如下:
package testMe
func f1(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return f1(n-1) + f1(n-2)
}
从上面的代码,您能看到定义了一个名为 f1()
函数,用来计算斐波纳切数。
testMe.go
的第二段代码如下:
func f2(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 2
}
return f2(n-1) + f2(n-2)
}
这段代码,您能看到另一个名为 f2()
的函数实现计算斐波纳切数。然而,这个函数有一个错误,因为在 n
为 1
时,它没有返回 1
,这毁掉了函数的整个功能。
testMe.go
的其余代码如下:
func s1(s string) int {
if s == "" {
return 0
}
n := 1
for range s {
n++
}
return n
}
func s2(s string) int {
return len(s)
}
这部分,我们实现了俩个函数,分别为 s1()
和 s2()
,用来处理字符串。它们都返回字符串长度。然而,s1()
的实现是错误的,因为 n
的初始值是 1 而不是 0。
现在开始考虑测试和测试用例。首先,您应该创建一个名为 testMe_test.go
的文件来存放您的测试代码。接着,重要的是认识到您不需要对 testMe.go
的代码做任何改变。最后,记住您应该根据需要尽可能多的编写测试函数来覆盖所有潜在的输入和输出。
testMe_test.go
的第一部分如下:
package testMe
import "testing"
func TestS1(t *testing.T) {
if s1("123456789") != 9 {
t.Error(`s1("123456789") != 9`)
}
if s1("") != 0 {
t.Error(`s1("") != 0`)
}
}
上面的函数对 s1()
函数执行俩个测试:一个使用 "123456789"
作为输入,另一个用 ""
作为输入。
testMe_test.go
的第二部分如下:
func TestS2(t *testing.T) {
if s2("123456789") != 9 {
t.Error(`s2("123456789") != 9`)
}
if s2("") != 0 {
t.Error(`s2("") != 0`)
}
}
上面对测试代码对 s2()
函数执行同样的俩个测试。
testMe_test.go
的其余代码如下:
func TestF1(t *testing.T) {
if f1(0) != 0 {
t.Error(`f1(0) != 0`)
}
if f1(1) != 1 {
t.Error(`f1(1) != 1`)
}
if f1(2) != 1 {
t.Error(`f1(2) != 1`)
}
if f1(10) != 55 {
t.Error(`f1(10) != 55`)
}
}
func TestF2(t *testing.T) {
if f2(0) != 0 {
t.Error(`f2(0) != 0`)
}
if f2(1) != 1 {
t.Error(`f2(1) != 1`)
}
if f2(2) != 1 {
t.Error(`f2(2) != 1`)
}
if f2(10) != 55 {
t.Error(`f2(10) != 55`)
}
}
上面的代码测试了 f1()
和 f2()
函数的操作。
执行测试将产生如下输出:
如果您没使用 -v 参数(产生详细输出),您将得到如下输出:
您希望执行某些测试用例的话,您应该使用 -run
命令行选项,它接收一个正则表达式并执行所有函数名与给定正则表达式匹配的测试。
最后的命令验证了 go test
命令使用了缓存。
软件测试只能显示一个或多个 bug 的存在,而不是没有 bug !这意味着您绝不能绝对确定代码没有 bug 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论