GoLang进阶学习之单元测试(思想、框架、实践等)

单元测试是什么

单元测试可以检查我们的代码能否按照预期进行,代码逻辑是否有问题,以此可以提升代码质量。
简单来说单元测试就是针对某一个函数方法进行测试,我们要先测试正确的传值与获取正确的预期结果,然后再添加更多测试用例,得出多种预期结果。尽可能达到该方法逻辑没有问题,或者问题都能被我们预知到。这就是单元测试的好处。

Golang是怎么写单元测试的?

很简单!Golang本身对自动化测试非常友好,并且有许多优秀的测试框架支持,非常好上手。
文中将以新手的角度,快速上手一一实践给大家感受Go单元测试的魅力。

写一个最简单的Test吧!

先来了解一下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

此时提示测试不通过,得到的值与预期的值不相同。
这就是一个最简单的测试写法,我们可以进行正确或错误的测试。

这里介绍几个常用的参数:

  1. -bench regexp 执行相应的 benchmarks,例如 -bench= (基准测试)
  2. -cover 开启测试覆盖率
  3. -run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数;
  4. -v 显示测试的详细命令

再添加一个被测试方法

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

学习GoConvey测试框架

在前面,我们判断预期结果都是用if…else之类的判断语句,如果面对更庞大的测试,有更多的测试用例,可能需要思考更多逻辑判断,加大代码长度与复杂度,不便于编写与管理。所以我们需要用到更好的测试框架来增强测试编写。
GoConvey是一款针对Golang的测试框架,它可以更好的管理和运行测试用例,而且又很丰富的断言函数,能够写出更完善的测试用例,并且还有web界面,是极其常用的测试框架。

添加一个匹配url的方法

func CheckUrl(url string) bool {
   
	var urlList = [2]string{
   "learnku.com", "xdcute.com"}
	for v := range urlList {
   
		if urlList[v] == url {
   
			return true
		}
	}
	return false
}

测试代码
记得先import "github.com/smartystreets/goconvey/convey"
或者在命令行输入go get github.com/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值