笔记
在V1处维持作证,在此存储库中不会接受破坏变化。
请参阅有关V2的讨论。
GO代码(Golang)一组软件包,这些软件包提供了许多工具,用于证明您的代码会按照您的意图行事。
功能包括:
简单的断言
嘲笑
测试套件界面和功能
开始:
使用一行代码安装作证,或用另一行更新
有关在GO中编写测试代码的介绍,请参见https://go.dev/doc/code#testing
查看API文档https://pkg.go.dev/github.com/stretchr/testify
使用tistifylint(通过golanci-lint)避免常见错误
关于测试驱动的开发(TDD)的一点
assert
包assert
软件包提供了一些有用的方法,使您可以在GO中编写更好的测试代码。
打印友好,易于阅读的失败说明
允许使用非常可读的代码
可选地用消息注释每个断言
在行动中看到它:
包装您的IMPORT(“测试” “ github.com/stretchr/testify/assert") func testsomething(t *testing.t) assert.Equal(t,123,123,“它们应该相等”)//断言不等式 assert.notequal(t,123,456,“它们不应相等”)// nil断言(适合错误) assert.nil(t,object)//断言不是零(当您期望某事时好) 如果assert.notnil(t,object){//现在我们知道对象不是零,我们可以安全地做出//进一步的断言,而不会引起任何错误(t,t,themse something'somets offect.bocke.bocke.value) } }
每个断言func将testing.T
对象作为第一个参数。 这就是它通过正常的go test
功能来写入错误的方式。
每个断言功能都会返回一个布尔,指示断言是否成功,这对于您想在某些条件下继续进一步断言很有用。
如果您多次主张,请使用以下内容:
包装您的IMPORT(“测试” “ github.com/stretchr/testify/assert") func testsomething(t *testing.t){断言:= assert.new(t) assert.Equal(123,123,“他们应该相等”)//断言不等式 assert.notequal(123,456,“它们不应相等”)// nil断言(适合错误) assert.nil(object)//断言不零(当您期望某事时好) 如果assert.notnil(object){//现在我们知道对象不是零,那么我们可以安全地做出//进一步的断言而不会引起任何错误(“某物”,object.value) } }
require
包装require
软件包提供了与assert
软件包相同的全局功能,但是而不是返回布尔结果,而是终止当前测试。这些功能必须从运行测试或基准功能的goroutine中调用,而不是从测试期间创建的其他goroutines来调用。否则可能会发生种族条件。
有关详细信息,请参见T.Failnow。
mock
包mock
软件包提供了一种机制,可轻松编写模拟对象,该对象在编写测试代码时可以代替真实对象。
一个示例测试功能,该功能测试依赖外部对象testObj
的代码,可以设置期望(作证)并断言它们确实发生了:
包装您的IMPORT(“测试” “ github.com/stretchr/testify/mock")/*测试对象* /// mymockedObject是一个模拟对象,它实现了一个接口//描述我正在测试的代码依赖的对象。 mock.mock} // dosomething是mymockedobject上的一种方法,它实现了某些接口//并仅记录活动,并返回模拟对象告诉它的内容。/////在真实对象中,此方法会做一些有用的东西,有用,但是,由于此//是一个模拟的对象 - 我们只是将其存根。////注意:此方法未在此处进行测试,因此使用此对象的代码为.func(m *mymockedobject)dosomething(数字) int)(bool,错误){args:= m.called(number)return args.bool(0),args.error(1) }/*实际测试函数*/// Testsomething是如何使用我们的测试对象来//对我们正在测试的某些目标代码进行断言的示例。我们的测试对象 testobj:= new(mymockedObject)//设置期望 testobj.on(“ Dosomething”,123)。返回(true,nil)//调用我们正在测试的代码 targetfuncthatdoessomethingwithobj(testobj)//断言期望得到满足 testobj.serserteppections(t) } // testsomethingwithplaceholder是如何使用我们的测试对象来//对我们正在测试的某些目标代码做出断言的第二个示例。//此一次使用占位符。当通过//传递数据通常是动态生成的,并且不能事先预测(例如,包含时间敏感的哈希)func testsomethingsomethingwithplaceholder(t *testing.t){//创建我们的实例,可以使用占位符。测试对象 testobj:= new(mymockedObject)//参数列表中的占位符设置期望 testobj.on(“ dosomething”,mock.anything)。返回(true,nil)//调用我们正在测试的代码 targetfuncthatdoessomethingwithobj(testobj)//断言期望得到满足 testobj.serserteppections(t) } // testsomethingelse2是第三个示例,它显示了如何使用//删除方法清理处理程序,然后添加新的。 testobj:= new(mymockedObject)//参数列表中的占位符设置期望 obercall:= testobj.on(“ dosomething”,mock.anything)。返回(true,nil)//调用我们正在测试的代码 targetfuncthatdoessomethingwithobj(testobj)//断言期望得到满足 testobj.sersertexpections(t)//现在删除处理程序,以便我们添加另一个优先级的处理程序 oikcall.unset()//现在返回false,而不是true testObj.on(“ dosomething”,mock.anything)。返回(false,nil)testobj.sersertexpections(t) }
有关如何编写模拟代码的更多信息,请查看mock
软件包的API文档。
您也可以使用嘲弄工具将模拟代码与接口自动化,从而更快地使用模拟。
suite
包警告
套件程序包不支持并行测试。参见#934。
suite
软件包提供了您可能会从更常见的面向对象的语言中使用的功能。 有了它,您可以将测试套件构建为结构,并在结构上构建设置/拆卸方法和测试方法,并按照正常方式使用“ GO测试”运行它们。
一个示例套件如下所示:
//基本importSimport(“ testing”“ github.com/stretchr/testify/assert”“ github.com/stretchr/testify/suite/suite”) - 包括//返回当前测试contextType expletestesuite struct {)的t()方法{ suite.suitevariablethatShouctSthardStattatFive int} //请确保在每个testfunc(suite *exkeptestsuite)setuptest(){suite.variablethatShatSthatSthardSthardSthardSthardStattatFive = 5} // test test test test test tests tests test tests“ a // suite.func(Suite *expletestsuite)testexample(){assert.equal(suite.t(),5,suite.variaiablethatShordShordSthostAtatFive) } //为了使“ Go Test”运行此套件,我们需要创建//正常的测试功能并将我们的套件传递到Suite.runfunc testexAmpleTestSuite(t *testing.t) extpetestsuite))) }
对于更完整的示例,使用套件软件包提供的所有功能,请查看我们的示例测试套件
有关写套件的更多信息,请查看suite
包的API文档。
Suite
对象具有断言方法:
//基本importSimport(“ testing”“ github.com/stretchr/testify/suite”)//定义套件,并从sidefiefify中吸收basic -in Basic suite //功能 - 包括断言方法。 suite.suitevariablethatShouddSthordStattatFive int} //确保将variablethatShordStatatFive设置为五// //在每个testfunc(suite *exkeptestsuite)setuptest() a // suite.func(Suite *expletestSuite)testexample(){suite.equal(suite.variaiablethatshouldstartatfive,5) } //为了使“ Go Test”运行此套件,我们需要创建//正常的测试功能并将我们的套件传递到Suite.runfunc testexAmpleTestSuite(t *testing.t) extpetestsuite))) }
要安装作证,请使用go get
:
go get github.com/stretchr/testify
然后,这将使您可用以下软件包:
github.com/stretchr/testify/assert github.com/stretchr/testify/require github.com/stretchr/testify/mock github.com/stretchr/testify/suite github.com/stretchr/testify/http (deprecated)
使用此模板将testify/assert
软件包导入您的代码:
包装您的IMPORT(“测试” “ github.com/stretchr/testify/assert") func testsomething(t *testing.t){assert.true(t,true,“ true as true!”) }
要将作证更新为最新版本,请使用go get -u github.com/stretchr/testify
。
我们目前支持1.19开始的最新主要GO版本。
请随时提交问题,订购存储库并发送拉请请求!
提交问题时,我们要求您包含一个完整的测试功能,以证明该问题。对于使用作证的人编写证明它的测试代码的人来说,额外的信用。
使用代码生成。查找某些文件顶部Code generated with
。运行go generate ./...
以更新生成的文件。
我们还在#testify
和#testify-dev
频道中的Gophers Slack组上聊天。
该项目是根据MIT许可证的条款获得许可的。