内容简介:在 Go 语言中,支持为功能模块编写单元测试代码,继续以上篇教程构建的计算器项目为例,在编写
单元测试
编写单元测试
在 Go 语言中,支持为功能模块编写单元测试代码,继续以上篇教程构建的计算器项目为例,在 simplemath 包中,我们可以为每一个运算模块编写了对应的单元测试代码,单元测试文件以 _test 作为文件名后缀来标识,比如我们通过 add_test.go 和 sqrt_test.go 文件分别为 add.go 和 sqrt.go 编写单元测试,对应的目录结构如下:
编写 add_test.go 代码如下:
package simplemath
import "testing"
func TestAdd(t *testing.T) {
r := Add(1, 2)
if r != 3 {
t.Errorf("Add(1, 2) failed. Got %d, expected 3.", r)
}
}
以及 sqrt_test.go 代码如下:
package simplemath
import "testing"
func TestSqrt(t *testing.T) {
v := Sqrt(9)
if v != 3 {
t.Errorf("Sqrt(9) failed. Got %v, expected 3.", v)
}
}
在编写单元测试时,需要引入 testing 包,你可以将其类比为 PHP 中的 PHPUnit 或 Java 中的 JUnit,我们可以基于该包提供的方法来实现自动化测试,测试方法的格式如下所示:
func TestXXX(t *testing.T) {
// 测试逻辑
}
运行单元测试
接下来,怎么运行这些单元测试呢?这也非常简单。因为我们前面已经设置了 GOPATH 环境变量,所以可以在任意目录下执行以下命令:
可以看到,运行结果列出了测试的内容、测试结果和测试时间。如果我故意把 add_test.go 的代码改成这样的错误场景:
func TestAdd(t *testing.T) {
r := Add(1, 2)
if r != 2 {
t.Errorf("Add(1, 2) failed. Got %d, expected 3.", r)
}
}
然后我们再次执行单元测试,将得到如下的结果:
打印的错误信息非常简洁,却已经足够让开发者快速定位到问题代码所在的文件和行数,从而在最短的时间内确认是单元测试的问题还是程序的问题。
当然,这里我们只是介绍了最基本的单元测试实现,更加复杂的测试实现,我们后面在介绍 Go 语言特性时还会提到。
问题定位与调试
打印变量
当然,对于一些简单的测试,还可以通过打印变量的方式来定位问题,通常我们在 PHP 中就是这么做的,比如通过 var_dump 、 printf 、 echo 之类的语句或函数打印返回的结果,在 Laravel 框架中还可以通过 dd 或 dump 方法进行简单高效的变量打印调试,在 Go 语言中,对应的方式是前面介绍过的 Printf 或 Println 方法,用于对变量进行格式化输出(类比 PHP 中的 printf 函数和 print 函数,PHP 没有提供类似 Println 这样的方法,但是你可以通过在打印字符串结尾加上 \n 来实现换行),这两个方法都位于 fmt 格式化包中,我们可以这样打印变量:
fval := 110.48
ival := 200
sval := "This is a string. "
fmt.Println("The value of fval is", fval)
fmt.Printf("fval=%f, ival=%d, sval=%s\n", fval, ival, sval)
fmt.Printf("fval=%v, ival=%v, sval=%v\n", fval, ival, sval)
对应的输出结果是:
The value of fval is 110.48 fval=110.480000, ival=200, sval=This is a string. fval=110.48, ival=200, sval=This is a string.
输出日志
如果代码是在线上生产环境执行,打印变量这种定位问题的方式就不合适了,这个时候我们可以通过 log 包提供的方法打印关键信息或错误信息日志,方便对线上问题进行追踪,关于日志功能后面我们在进阶版的工程管理中会详细介绍,这里先了解下即可。
IDE 调试
如果你是通过 GoLand 进行开发的话,直接在代码中设置断点(单击对应代码行),然后选中要调试的源码文件,右键下拉菜单中点击「Debug」对应的选项即可开始对代码进行断点调试:
进入调试模式后,在 GoLand 界面下方控制台就可以通过手动控制(跳入、跳出、进入下一行、终止调试等)对代码进行 Debug 了,具体操作模式和 PHPStorm 差不多:
GoLand 官方博客也有一篇介绍教程: https://blog.jetbrains.com/go/2019/02/06/debugging-with-goland-getting-started/ ,感兴趣的可以看下。
GDB 调试
GDB 是一个由 GNU 开源组织发布的、Unix/Linux 操作系统下的、基于命令行的、功能强大的程序调试工具,Go 语言编译后的二进制文件支持通过 GDB 进行调试,比如上篇教程通过 go build calc 编译出来的可执行文件 calc ,就可以直接用以下命令以调试模式运行:
gdb calc
注:Windows 系统不支持该工具,Mac 下可以通过 brew install gdb 命令安装。
然后,你就可以通过 GDB 支持的指令以命令行的方式对 Go 代码进行调试了,你可以通过 l 指令查看代码:
要跳到某一行查看通过 l <line> 传入行数即可:
要为某一行设置断点可以通过 b <line> 来实现:
然后通过 run 命令来运行程序,如果是在 Mac 系统上,可能会报下面这个错:
这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名,对应的解决方法参考这里: https://opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt ( 中文对应的解决方式 )。
进入下一行可以用 n 指令,打印变量可以用 p <var> 指令传入变量名。。。更多指令使用我就不深入展开了,因为对于新手来说,不推荐使用 GDB 进行代码调试,直接使用 GoLand 更友好,不是吗?如果你想探究 GDB 调试的更多用法,请查看 对应的官方文档 。
至此,Go 语言零基础入门三步曲已经完结,分别是第一个 Go 程序、简单的工程管理、单元测试及问题追踪,下一篇起,我们将正式开始介绍 Go 语言的语言特性、面向对象编程、并发编程、网络编程等高级使用指南,你可以通过学院和微信公众号(公众号搜索学院君的后花园或 geekacademy 点击关注即可)关注此系列教程的更新动态,学习过程中有任何问题,可以通过教程下方的评论或加入社群与学院君讨论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 学习 Node.js,第 9 单元:单元测试
- Vue 应用单元测试的策略与实践 02 - 单元测试基础
- Vue 应用单元测试的策略与实践 04 - Vuex 单元测试
- Vue 应用单元测试的策略与实践 03 - Vue 组件单元测试
- Angular单元测试系列-Component、Directive、Pipe 以及Service单元测试
- 单元测试 – 我应该对不应该在函数中传递的数据(无效输入)进行单元测试吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Practical Django Projects, Second Edition
James Bennett / Apress / 2009 / 44.99
Build a django content management system, blog, and social networking site with James Bennett as he introduces version 1.1 of the popular Django framework. You’ll work through the development of ea......一起来看看 《Practical Django Projects, Second Edition》 这本书的介绍吧!
HTML 编码/解码
HTML 编码/解码
Markdown 在线编辑器
Markdown 在线编辑器