26k Star的Go测试库Testify:断言、Mock、Suite一站搞定
文章目录
- 26k Star的Go测试库Testify:断言、Mock、Suite一站搞定
- assert:断言不再是体力活
- require:失败就停
- mock:别手写假对象了
- suite:setup/teardown回到Go
- 安装和版本
- 一句话总结
- 一句话总结
26k Star的Go测试库Testify:断言、Mock、Suite一站搞定
写Go代码的人都经历过:标准库的testing包只给了t.Error和t.Fatal,没有断言、没有mock、没有suite。一个简单的判断要写四五行if err != nil,测试代码量经常超过业务代码。
Testify就是为了填这个坑而出现的。GitHub上26,002个Star,几乎所有Go项目都在用它写测试。它把Go测试中缺失的三个能力一次性补齐了。
assert:断言不再是体力活
assert包封装了Go标准库没有的断言方法,把测试代码从手工检查中解放出来:
assert.Equal(t,123,123,"they should be equal")assert.NotEqual(t,123,456,"they should not be equal")assert.Nil(t,err)assert.NotNil(t,result)每个断言接受testing.T作为第一个参数,失败信息通过标准go test输出。每个方法返回bool值,可以在条件满足时继续后续断言:
ifassert.NotNil(t,object){assert.Equal(t,"Something",object.Value)}断言多的时候,创建assert实例省掉每次传t:
assert:=assert.New(t)assert.Equal(123,123,"they should be equal")assert.NotEqual(123,456,"they should not be equal")require:失败就停
require的API和assert完全一致,只差一个行为:assert失败后继续执行,require失败后立刻终止当前测试。适合"这个不成立后面就全没意义了"的场景。
mock:别手写假对象了
单元测试最绕不开的就是mock。Go标准库没给mock能力,手写假对象结构体又耗时又容易漏。Testify的mock包把这件事拉平了:
typeMyMockedObjectstruct{mock.Mock}func(m*MyMockedObject)DoSomething(numberint)(bool,error){args:=m.Called(number)returnargs.Bool(0),args.Error(1)}funcTestSomething(t*testing.T){testObj:=new(MyMockedObject)testObj.On("DoSomething",123).Return(true,nil)targetFuncThatDoesSomethingWithObj(testObj)testObj.AssertExpectations(t)}用On().Return()声明期望调用,AssertExpectations验证是否按预期执行。支持mock.Anything作为占位符,参数值不确定时也能写断言。
如果觉得手写mock结构体还是麻烦,配合mockery工具可以根据interface自动生成mock代码。
suite:setup/teardown回到Go
写过Java或Python测试的人会怀念setUp/tearDown。Testify的suite包把这种组织方式搬到了Go:
typeExampleTestSuitestruct{suite.Suite VariableThatShouldStartAtFiveint}func(suite*ExampleTestSuite)SetupTest(){suite.VariableThatShouldStartAtFive=5}func(suite*ExampleTestSuite)TestExample(){suite.Equal(suite.VariableThatShouldStartAtFive,5)}funcTestExampleTestSuite(t*testing.T){suite.Run(t,new(ExampleTestSuite))}定义结构体嵌入suite.Suite,写SetupTest和TearDownTest,Test开头的方法自动成为测试用例。suite.Suite内置了断言方法,连assert包也不用单独导入了。
suite包不支持并行测试,如果需要并行跑用例,用assert或require包自己组织。
安装和版本
一行命令安装:
go get github.com/stretchr/testify更新到最新版:
go get-ugithub.com/stretchr/testify支持Go 1.19及以上版本。目前维护在v1,不再接收破坏性变更。
一句话总结
Go的标准库测试太底层,Testify补上了断言、mock和suite三个缺口。26k的Star数不是白来的,如果你的Go项目测试代码里还全是if err != nil,换Testify会让代码精简不少。
一句话总结
Go的标准库测试太底层,Testify补上了断言、mock和suite三个缺口。26k的Star数不是白来的,如果你的Go项目测试代码里还全是if err != nil,换Testify会让代码精简不少。
