3 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
您列出的三種策略之間的根本區(qū)別在于測試代碼是否與被測代碼在同一個包中。在使用的決定package myfunc
或package myfunc_test
在測試文件取決于你是否要執(zhí)行白盒或黑箱測試。
在項(xiàng)目中同時(shí)使用這兩種方法并沒有錯。例如,您可以擁有myfunc_whitebox_test.go
和myfunx_blackbox_test.go
。
測試代碼包比較
黑盒測試:使用
package myfunc_test
,這將確保您只使用導(dǎo)出的標(biāo)識符。白盒測試:使用
package myfunc
以便您可以訪問非導(dǎo)出的標(biāo)識符。適用于需要訪問非導(dǎo)出變量、函數(shù)和方法的單元測試。
問題中列出的策略的比較
策略 1:文件
myfunc_test.go
使用package myfunc
- 在這種情況下, 中的測試代碼myfunc_test.go
將與 中正在測試的代碼位于同一包中myfunc.go
,myfunc
在本例中。策略 2:文件
myfunc_test.go
使用package myfunc_test
——在這種情況下,myfunc_test.go
“將作為單獨(dú)的包編譯,然后與主測試二進(jìn)制文件鏈接并運(yùn)行”中的測試代碼。[來源:test.go源代碼中的第 58-59 行]策略 3:文件
myfunc_test.go
使用package myfunc_test
但myfunc
使用點(diǎn)表示法導(dǎo)入- 這是策略 2 的變體,但使用點(diǎn)表示法導(dǎo)入myfunc
.

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個贊
這取決于您的測試范圍。高級測試(集成、驗(yàn)收等)可能應(yīng)該放在一個單獨(dú)的包中,以確保您通過導(dǎo)出的 API 使用該包。
如果您有一個包含大量內(nèi)部組件的大型包需要進(jìn)行測試,那么請使用相同的包進(jìn)行測試。但這并不是讓您的測試訪問任何私有狀態(tài)的邀請。這將使重構(gòu)成為一場噩夢。當(dāng)我在 go 中編寫結(jié)構(gòu)時(shí),我經(jīng)常實(shí)現(xiàn)接口。我從測試中調(diào)用的是那些接口方法,而不是所有的輔助方法/函數(shù)。

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個贊
您應(yīng)該盡可能使用策略 1。您可以使用特殊的foo_test
包名來避免導(dǎo)入循環(huán),但這主要是因?yàn)榭梢允褂孟嗤臋C(jī)制測試標(biāo)準(zhǔn)庫。例如,strings
不能使用策略 1 進(jìn)行測試,因?yàn)?code>testing包依賴于strings
. 正如您所說,使用策略 2 或 3,您無權(quán)訪問包的私有標(biāo)識符,因此除非必須,否則通常最好不要使用它。
- 3 回答
- 0 關(guān)注
- 314 瀏覽
添加回答
舉報(bào)