eclipse junit怎么不进入test代码?_Go 语言基础入门教程 —— 单元测试、问题定位与代码调试...

单元测试

编写单元测试

在 Go 语言中,支持为功能模块编写单元测试代码,继续以上篇教程构建的计算器项目为例,在 simplemath 包中,我们可以为每一个运算模块编写了对应的单元测试代码,单元测试文件以 _test 作为文件名后缀来标识,比如我们通过 add_test.go 和 sqrt_test.go 文件分别为 add.go 和 sqrt.go 编写单元测试,对应的目录结构如下:

ceced885dab4382c9bb384023ecc986b.png

编写 add_test.go 代码如下:

package simplemathimport "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 simplemathimport "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 环境变量,所以可以在任意目录下执行以下命令:

2153ef93e2240ecc5262877d724e868b.png

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

然后我们再次执行单元测试,将得到如下的结果:

ed5096538a2a5d0dde486124346259a3.png

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

当然,这里我们只是介绍了最基本的单元测试实现,更加复杂的测试实现,我们后面在介绍 Go 语言特性时还会提到。

问题定位与调试

打印变量

当然,对于一些简单的测试,还可以通过打印变量的方式来定位问题,通常我们在 PHP 中就是这么做的,比如通过 var_dumpprintfecho 之类的语句或函数打印返回的结果,在 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.48fval=110.480000, ival=200, sval=This is a string. fval=110.48, ival=200, sval=This is a string.
输出日志

如果代码是在线上生产环境执行,打印变量这种定位问题的方式就不合适了,这个时候我们可以通过 log 包提供的方法打印关键信息或错误信息日志,方便对线上问题进行追踪,关于日志功能后面我们在进阶版的工程管理中会详细介绍,这里先了解下即可。

IDE 调试

如果你是通过 GoLand 进行开发的话,直接在代码中设置断点(单击对应代码行),然后选中要调试的源码文件,右键下拉菜单中点击「Debug」对应的选项即可开始对代码进行断点调试:

57947458beb9b63c53089dd6138a2193.png

进入调试模式后,在 GoLand 界面下方控制台就可以通过手动控制(跳入、跳出、进入下一行、终止调试等)对代码进行 Debug 了,具体操作模式和 PHPStorm 差不多:

4734bc9714e59c4485879e48ae6ccf11.png

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

ea6aaf977b4c647c7d40f85a99a4c9ee.png

注:Windows 系统不支持该工具,Mac 下可以通过 brew install gdb 命令安装。

然后,你就可以通过 GDB 支持的指令以命令行的方式对 Go 代码进行调试了,你可以通过 l 指令查看代码:

39226715727836a674cbf7755fc895f1.png

要跳到某一行查看通过 l  传入行数即可:

4bc3c262967c817fd7d8fa6b3bf2f0a2.png

要为某一行设置断点可以通过 b  来实现:

769befc7d72e0840504f3b5e8072a01a.png

然后通过 run 命令来运行程序,如果是在 Mac 系统上,可能会报下面这个错:

ba82c321d2ea1ada5c4a28e597859c0b.png

这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名,对应的解决方法参考这里:https://opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt。

进入下一行可以用 n 指令,打印变量可以用 p  指令传入变量名。。。更多指令使用我就不深入展开了,因为对于新手来说,不推荐使用 GDB 进行代码调试,直接使用 GoLand 更友好,不是吗?如果你想探究 GDB 调试的更多用法,请查看对应的官方文档:https://golang.org/doc/gdb 。

至此,Go 语言零基础入门三步曲已经完结,分别是第一个 Go 程序、简单的工程管理、单元测试及问题追踪,下一篇起,我们将正式开始介绍 Go 语言的语言特性、面向对象编程、并发编程、网络编程等高级使用指南,你可以通过学院和微信公众号(公众号搜索学院君的后花园或 geekacademy 点击关注即可)关注此系列教程的更新动态,学习过程中有任何问题,可以通过教程下方的评论或加入社群与学院君讨论:

eeae7d6018b4ce15a84b5cc8bac10abe.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值