16:17

在 simplemath 包中,我们可以为每一个运算模块编写了对应的单元测试代码。

单元测试文件默认以同一目录下文件名后缀 _test 作为标识,比如我们在 simplemath目录下新建 add_test.go 和 sqrt_test.go 文件,分别为 add.go 和 sqrt.go 编写单元测试,对应的目录结构如下:

编写 add_test.go 代码如下:

packagesimplemath

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 代码如下:

packagesimplemath

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

// 测试逻辑

}

运行单元测试

接下来,怎么运行这些单元测试呢?这也非常简单。

在 GoLand 中,你可以选择要执行单元测试的包,比如这里的 simplemath,然后通过右键快捷菜单依次选择 Run->go test simplemath:

就可以在 GoLand 底部 Run 窗口中看到测试运行结果:

可以看到,运行结果列出了测试的内容、测试结果和测试时间。如果我故意把 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)

}

}

然后我们再次执行单元测试,这一次,我们可以直接选择对 add_test.go执行单元测试,在打开的 add_test.go 文件代码编辑区域通过右键快捷菜单选择 Run ‘add_test.go’ 即可:

当然,你可以可以具体对某个方法进行单元测试,点击 GoLand 在行号右侧为测试方法渲染的绿色测试小图标,选择 Run ‘TestAdd in calc/simplepath’ 即可:

不管以何种方式运行测试,最终都会都到如下的测试失败结果:

打印的错误信息非常简洁,却已经足够让开发者快速定位到问题代码所在的文件和行数,从而在最短的时间内确认是单元测试的问题还是程序的问题。

问题定位与调试

打印变量

当然,对于一些简单的测试,还可以通过打印变量的方式来定位问题,通常我们在 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、ItelliJ IDEA 差不多: