单元测试可以检查我们的代码能否按照预期进行,代码逻辑是否有问题,以此可以提升代码质量。
简单来说单元测试就是针对某一个函数方法进行测试,我们要先测试正确的传值与获取正确的预期结果,然后再添加更多测试用例,得出多种预期结果。尽可能达到该方法逻辑没有问题,或者问题都能被我们预知到。这就是单元测试的好处。
很简单!Golang本身对自动化测试非常友好,并且有许多优秀的测试框架支持,非常好上手。
文中将以新手的角度,快速上手一一实践给大家感受Go单元测试的魅力。
先来了解一下Go官方的testing包
要编写一个测试文件,需要创建一个名称以 _test.go 结尾的文件,该文件包含 TestXxx 函数,如上所述。 将该文件放在与被测试文件相同的包中。该文件将被排除在正常的程序包之外,但在运行 go test 命令时将被包含。
测试函数的签名必须接收一个指向testing.T类型的指针,并且不能返回任何值。函数名最好是Test+要测试的方法函数名。
记得一定要先看一下Testing的官方文档!
目录结构
test_study
-----samples.go
-----samples_test.go
被测试代码
package test_study
import "fmt"
func Hello() string {
return "Hello, world"
}
func main() {
fmt.Println(Hello())
}
这个代码将输出一句“Hello, world”
测试
package test_study
import "testing"
func TestHello(t *testing.T) {
got := Hello()
want := "Hello, world"
if got != want {
t.Errorf("got %q want %q", got, want)
}
}
测试结果
D:\goproj\test_study>go test -v
=== RUN TestHello
--- PASS: TestHello (0.00s)
PASS
ok _/D_/goproj/test_study 0.030s
说明我们的测试通过了,返回的值与我们预期的值是相同的。
现在尝试把预期结果修改一下
want := "xdcute.com"
测试结果
D:\goproj\test_study>go test -v
=== RUN TestHello
samples_test.go:9: got "Hello, world" want "xdcute.com"
--- FAIL: TestHello (0.00s)
FAIL
exit status 1
FAIL _/D_/goproj/test_study 0.159s
此时提示测试不通过,得到的值与预期的值不相同。
这就是一个最简单的测试写法,我们可以进行正确或错误的测试。
这里介绍几个常用的参数:
再添加一个被测试方法
func Add(a,b int) int{
return a+b
}
测试代码
func TestAdd(t *testing.T) {
sum := Add(5,5)
if sum == 10 {
t.Log("the result is ok")
} else {
t.Fatal("the result is wrong")
}
}
使用-run来测试,发现只运行了TestAdd测试方法。
D:\goproj\test_study>go test -v -run TestAdd
=== RUN TestAdd
samples_test.go:16: the result is ok
--- PASS: TestAdd (0.00s)
PASS
ok _/D_/goproj/test_study 0.176s
写好测试后,可以利用Go自带的工具 test coverage 查看一下单元测试覆盖率
测试覆盖率是一个术语,用于统计通过运行程序包的测试多少代码得到执行。 如果执行测试套件导致80%的语句得到了运行,则测试覆盖率为80%。
来尝试一下吧~
D:\goproj\test_study>go test -cover
PASS
coverage: 66.7% of statements
ok _/D_/goproj/test_study 0.163s
可以看到刚才我们写的测试,覆盖率为66.7%。
再回过头看一下我们的被测试代码,还有一个main()在测试中没有执行到,只执行了Hello()和Add(),所以覆盖率只有66.7%。试着在测试代码中直接加上“main()”的调用。
现在的测试覆盖率就是100%了,并且在PASS之前输出了一句“Hello, world”
D:\goproj\test_study>go test -cover
Hello, world
PASS
coverage: 100.0% of statements
ok _/D_/goproj/test_study 0.162s
在前面,我们判断预期结果都是用if…else之类的判断语句,如果面对更庞大的测试,有更多的测试用例,可能需要思考更多逻辑判断,加大代码长度与复杂度,不便于编写与管理。所以我们需要用到更好的测试框架来增强测试编写。
GoConvey是一款针对Golang的测试框架,它可以更好的管理和运行测试用例,而且又很丰富的断言函数,能够写出更完善的测试用例,并且还有web界面,是极其常用的测试框架。
添加一个匹配url的方法
func CheckUrl(url string) bool {
var urlList = [2]string{
"learnku.com", "xdcute.com"}
<