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

目录

  • 单元测试是什么
  • Golang是怎么写单元测试的?
  • 写一个最简单的Test吧!
  • 看看单元测试覆盖率
  • 学习GoConvey测试框架
  • 利用GoConvey定义多个测试用例
  • 学习Testify测试框架
  • 结合表格驱动测试
  • 使用Gomock框架-模拟接口
  • 最简单的打桩(stubs)
  • 使用GoStub框架-变量、函数、过程打桩
  • HttpMock-模拟http请求
  • SqlMock-模拟数据库请求
  • GoMonkey-强大的打桩框架
  • 测试风格介绍
  • 总结

单元测试是什么

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

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"}
	<

你可能感兴趣的:(go,编程语言,golang,单元测试)