
文章目录26k Star的Go测试库Testify断言、Mock、Suite一站搞定assert断言不再是体力活require失败就停mock别手写假对象了suitesetup/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实例省掉每次传tassert: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代码。suitesetup/teardown回到Go写过Java或Python测试的人会怀念setUp/tearDown。Testify的suite包把这种组织方式搬到了GotypeExampleTestSuitestruct{suite.Suite VariableThatShouldStartAtFiveint}func(suite*ExampleTestSuite)SetupTest(){suite.VariableThatShouldStartAtFive5}func(suite*ExampleTestSuite)TestExample(){suite.Equal(suite.VariableThatShouldStartAtFive,5)}funcTestExampleTestSuite(t*testing.T){suite.Run(t,new(ExampleTestSuite))}定义结构体嵌入suite.Suite写SetupTest和TearDownTestTest开头的方法自动成为测试用例。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会让代码精简不少。