用Golang开始TDD
这篇文章的目的是什么?
Go语言和测试驱动开发(TDD)是为了帮助你掌握”哦,原来可以这样做”的感觉而写的文章。
【目标人群】
-
- golangこれから学ぶぞ
-
- golangちょっとだけしってる
-
- テストコードってどう書けばいいんだろう
- TDDやったことない
只针对这样的人。
【试一试】
<golang基础教程>
你好,世界。
当谈到语言学习的起步时,肯定是先学习”Hello World”的!就像在学习Go语言一样,我们也可以通过Hello World来确认一下它的感觉。
我想很多人都知道,即使不需要进行环境准备,也可以在Playground上尝试。
如果只是想确认一下简单的操作,那么可以进行验证。
马上去Playground中执行“Hello World”吧!
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
□ 环境的准备
首先,请把go的代码放进来。
请访问以下公式网站,下载并安装最新版本而非Beta版:
https://golang.org/dl/
完成设置golang之后,接下来准备“编辑器”。个人推荐使用“VS Code”。
https://code.visualstudio.com/

由于輕量且支援多種插件,使得調試更容易且易於操作。本次將基於使用「VS Code」和「插件」來推進對話。
插件将安装以下两个选项。


基本语法
现在环境已经准备好了,接下来只需要实际动手了,但在此之前让我们先了解一下golang的基本语法。
由于有一份非常好的官方资料可以通过动手实践来理解,所以在这里就不具体介绍了。
□ 使用Golang编写的测试代码。
(Use Golang to write test code.)
在这里不会详细讲解go test的规格等细节,但我想简要说明一下如何编写测试代码的三个要点。
-
- ファイルの名前は「xxx_test.go」で対応させtestingパッケージを利用する
-
- 標準関数で評価は十分できる
- Table Driven Testが推奨されている
请参考下面这篇很棒的文章,了解关于进行测试的详细概述。
以下是关于Go语言测试的网址列表:
1. https://golang.org/pkg/testing/
2. https://budougumi0617.github.io/2018/08/19/go-testing2018/
3. https://swet.dena.com/entry/2018/01/16/211035
请点击以上链接查阅相关内容。
文件名称应为“xxx_test.go”,并使用testing包进行对应。
以下是同样的内容的中文翻译:
根据主要原则,撰写测试代码的文件应命名为xxx_test.go(xxx通常是测试对象代码的文件名)。通过这样的命名,当执行”go test”命令时,它将被识别为测试代码。
尽管xxx并不一定与测试对象代码的文件名有关,但通常情况下建议使用相同的命名,所以没有必要刻意做出改变。
$ ls
main.go main_test.go
$ go test
PASS
ok _/home/debug/test 0.007s
$ go build
$ ls
main.go main_test.go test
$ ls
aaa.go main.go
$ go test
? _/home/debug/test [no test files]
$ go build
$ ls
aaa.go main.go test
此外,我们将使用名为“testing”的包来运行测试。
这个包汇集了一些方便用于执行测试和确认各种事项的方法,所以在确认可以做什么之前,最好先查看一下参考文献。
顺便提一下,使用testing包还有其他注意事项。
作为测试运行的方法必须按照命名规则命名为TestXxx。
所以,写出来的话就会是这样了。
※ 在`Test`之后的字符串也需要符合驼峰命名规则。
package main
import (
"testing"
)
func TestXxx(t *testing.T) {
...
}
在标准函数中,可以充分评估。
在Java等语言中,通常会使用assert()函数来进行期望值的评估。
但在Golang中,更常见的是使用以下方式进行评估。
由于可以很好地进行评估,即使不使用assert()函数也足够,所以按照Go的方式进行测试评估。
package main
import (
"testing"
)
func Plus(x, y int) int {
return x + y
}
func TestPlus(t *testing.T) {
x, y := 1, 1
expectation := 3
res := Plus(x, y)
if res != expectation {
t.Errorf("Not equal value %v", res)
}
}
执行↑会得到这样的结果。
非常容易理解,可以知道在哪里出了问题。
=== RUN TestPlus
--- FAIL: TestPlus (0.00s)
prog.go:17: Not equal value 2
FAIL
推荐使用表驱动测试
大致来说,这是一种将测试用例用类似JSON外观的表格进行编写以便易懂的写法。
请参考相关资料和官方说明获取详细的解释和内容。
在这里只需要抓住大致的写法就好,我会提供一些实例。
package main
import (
"testing"
)
func Plus(x, y int) int {
return x + y
}
func TestPlus(t *testing.T) {
data := map[string]struct {
X int
Y int
Expectation int
}{
"正の整数+正の整数": {
X: 1,
Y: 1,
Expectation: 2,
},
"正の整数+負の整数": {
X: 1,
Y: -1,
Expectation: 0,
},
}
for name, d := range data {
t.Run(name, func(t *testing.T) {
res := Plus(d.X, d.Y)
if res != d.Expectation {
t.Errorf("Not equal value %v", res)
}
})
}
}
执行↑将得到以下结果。
=== RUN TestPlus
=== RUN TestPlus/正の整数+正の整数
=== RUN TestPlus/正の整数+負の整数
--- PASS: TestPlus (0.00s)
--- PASS: TestPlus/正の整数+正の整数 (0.00s)
--- PASS: TestPlus/正の整数+負の整数 (0.00s)
PASS
虽然在运行子测试之前只是轻松地完成了这样的写法,但是使用这种写法可以一目了然地知道在哪些情况下设置了什么样的数据,因此如果要进行多个案例,这是一个推荐的方式。
< 测试驱动开发基础教程 >
TDD的基本
好了,终于到了TDD的部分了。
关于TDD,有很多易于理解的说明文章,还有像t_wada这样类似于TDD现人神一样的人存在,所以请详细参考那边。
所以,在这里,我只介绍入口部分。
敏捷开发(TDD)并不是“先做出来!”而是以完成品应该具备的需求为基础,从测试用例出发的开发方法。因此,我个人认为“创建测试用例”的阶段非常重要。
然后,一旦测试用例完成,我们会执行“三个循环”进行开发。
– 红(引发失败)
– 绿(确保没有错误)
– 重构(修正为正确的形式)
只要按照这个循环进行下去,就能够保证产生出满足要求的可执行代码。
< Golang 与测试驱动开发(TDD)>
基本的做法如前所述,可参考该篇专栏中的 “AirPeaPro” 文章。
按照TDD循环:
– 创建“测试用例”,
– “用golang执行空白测试并引发错误”,
– “循环进行三个周期”。
只需专注地执行。
【总结】
如果要在golang中进行TDD,没有什么特别的事情。只要掌握了golang的测试方法和TDD的建议,就没有什么可怕的,所以请务必尝试一下!