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
    评论
Golang是一种开源编程语言,支持并发编程和垃圾回收。在编写Golang程序时,单元测试是非常重要的,因为它可以帮助我们确保代码的正确性。为了更好地进行单元测试,我们可以使用mock框架来模拟各种情况,以确保代码的正确性。以下是在Golang中使用mock框架进行单元测试的步骤: 1. 安装mock框架 在终端中输入以下命令进行安装: ``` go get github.com/stretchr/testify/mock ``` 2. 创建需要测试的代码 假设我们需要测试以下代码: ``` package main import ( "errors" ) type Calculator interface { Add(a, b int) int Subtract(a, b int) int } type MyCalculator struct{} func (mc MyCalculator) Add(a, b int) int { return a + b } func (mc MyCalculator) Subtract(a, b int) int { return a - b } func Divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("cannot divide by zero") } return a / b, nil } ``` 这个代码定义了一个Calculator接口和一个MyCalculator结构体,以及一个Divide函数,我们将使用mock框架来测试这个代码。 3. 创建mock类 我们需要创建一个mock类来模拟Calculator接口,以便在测试中使用。创建一个名为mockCalculator的文件,并在其中定义一个mockCalculator类: ``` package main import ( "github.com/stretchr/testify/mock" ) type MockCalculator struct { mock.Mock } func (mc *MockCalculator) Add(a, b int) int { args := mc.Called(a, b) return args.Int(0) } func (mc *MockCalculator) Subtract(a, b int) int { args := mc.Called(a, b) return args.Int(0) } ``` 这个类继承了mock框架的Mock类,并实现了Calculator接口的Add和Subtract方法。在这些方法中,我们调用了mc.Called方法来指示mock类返回什么值。 4. 编写测试用例 我们现在可以编写测试用例来测试我们的代码。创建一个名为main_test.go的文件,并在其中添加以下测试用例: ``` package main import ( "errors" "github.com/stretchr/testify/assert" "testing" ) func TestCalculator(t *testing.T) { mc := new(MockCalculator) mc.On("Add", 1, 2).Return(3) mc.On("Subtract", 3, 2).Return(1) calculator := MyCalculator{} assert.Equal(t, 3, calculator.Add(1, 2)) assert.Equal(t, 1, calculator.Subtract(3, 2)) mc.AssertExpectations(t) } func TestDivide(t *testing.T) { result, err := Divide(4, 2) assert.Nil(t, err) assert.Equal(t, 2, result) result, err = Divide(4, 0) assert.NotNil(t, err) assert.Equal(t, 0, result) } ``` 这些测试用例测试了我们的Calculator接口和Divide函数。在TestCalculator测试用例中,我们使用了mock类来模拟Calculator接口,并测试了Add和Subtract方法的正确性。在TestDivide测试用例中,我们测试了Divide函数的正确性。 5. 运行测试 在终端中输入以下命令来运行测试: ``` go test ``` 如果所有测试用例都通过,则表示我们的代码已通过单元测试。如果有任何测试用例失败,则需要查找代码中的错误并进行修复。 通过使用mock框架,我们可以更好地编写单元测试,以确保我们的代码在各种情况下都能正常工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值