筆記
在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.suitevariablethatShouddSthordStattatFive int} //確保將variablethatShordStatatFive設置為五// //在每個testfunc(suite *exkeptestsuite)setuptest() 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許可證的條款獲得許可的。