您好,登錄后才能下訂單哦!
小編給大家分享一下使用go優(yōu)雅地撰寫單元測試的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
剛剛加入一個年輕的小組,代碼中的單元測試還沒有來得及寫,leader希望我通過單元測試來熟悉項目的業(yè)務(wù)邏輯。但是,代碼量實在有點多,高效的完成單元測試成為首要目標。
單元測試測用的是testify的測試框架,使用起來非常方便,具體的基礎(chǔ)使用方法可以參考中文testify博客以及官方文檔。
在一個復雜的Web項目中,測試某一模塊的功能往往需要先對這一模塊所使用到的服務(wù)進行初始化,我們將初始化函數(shù)以及初始化函數(shù)所使用到的參數(shù)都放在同一個單元測試包下,例如對MySQL的初始化如下:
package unitTestfunc InitMySQL() error{ return db.Init(constant.MySQLDSN, constant.MaxIdleConns, constant.MaxOpenConns, time.Duration(constant.ConnMaxLifetime)*time.Second, constant.EnableSqlLog)//其他包中已經(jīng)封裝了初始化函數(shù),在測試包的初始化函數(shù)中調(diào)用即可}func CloseDB() error{ return db.Close()}
我們在另一個contant包下存放對應的參數(shù):
package constantconstant( MySQLDSN = "username:password@addresss/db?timeout=5000ms&readTimeout=5s&charset=utf8mb4" MaxIdleConns = 20 MaxOpenConns = 20 ConnMaxLifetime = 60 EnableSqlLog = true MerchantID = 6666 SheetID = "SZSWIMTEST" Operator = "XXXX@XXXX")
以下以對數(shù)據(jù)庫的操作為例
單元測試主要由三部分組成:
第一部分為固定寫法
type ActionLogRepo struct { basetest.BaseSuite}
第二部分為對Register進行初始化,Register函數(shù)可以傳入四個參數(shù)fun1,fun2,fun3,fun4
fun1:在該測試文件中的最開始執(zhí)行一次。
fun2:在每個單元測試前都執(zhí)行一次。
fun3:在每個單元測試后都執(zhí)行一次。
fun4:在該測試文件中的最終執(zhí)行一次。
根據(jù)需求,我們需要在所有單元測試開始前執(zhí)行一次初始化數(shù)據(jù)庫操作,以及在最后關(guān)閉數(shù)據(jù)庫。
func TestActionLogRepo(t *testing.T) { AgentSuite := new(ActionLogRepo) var err error AgentSuite.Register( func() { err = unitTest.InitMySQL() }, nil, nil, func() { err = unitTest.CloseDB() }) assert.Nil(t,err) suite.Run(t, AgentSuite)}
第三部分,進行單元測試,我們先在數(shù)據(jù)庫中建立對應的數(shù)據(jù),然后調(diào)用需要單元測試的函數(shù)進行對該數(shù)據(jù)的操作,之后使用assert對該結(jié)果進行驗證,最后要記得刪除掉單元測試的記錄。
func (suite *ActionLogRepo) TestActionLog() { repo := repository.NewRepository()//獲取數(shù)據(jù)庫 actionLog := &model.ActionLogTab{XXXXXX} err := CreateActionLog(actionLog)//創(chuàng)建測試的數(shù)據(jù)記錄 assert.Nil(suite.T(),err) logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要測試的函數(shù) assert.Nil(suite.T(),err) assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//驗證函數(shù)的正確性 err = repo.MerchantDB().Delete(actionLog).Error//刪除掉測試的數(shù)據(jù)庫記錄 assert.Nil(suite.T(),err)}
最終的測試文件結(jié)構(gòu)如下:
package testtype ActionLogRepo struct { basetest.BaseSuite}func TestActionLogRepo(t *testing.T) { AgentSuite := new(ActionLogRepo) var err error AgentSuite.Register( func() { err = unitTest.InitMySQL() }, nil, nil, func() { err = unitTest.CloseDB() }) assert.Nil(t,err) suite.Run(t, AgentSuite)}func (suite *ActionLogRepo) TestActionLog() { repo := repository.NewRepository()//獲取數(shù)據(jù)庫 actionLog := &model.ActionLogTab{XXXXXX} err := CreateActionLog(actionLog)//創(chuàng)建測試的數(shù)據(jù)記錄 assert.Nil(suite.T(),err) logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要測試的函數(shù) assert.Nil(suite.T(),err) assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//驗證函數(shù)的正確性 err = repo.MerchantDB().Delete(actionLog).Error//刪除掉測試的數(shù)據(jù)庫記錄 assert.Nil(suite.T(),err)}
看完了這篇文章,相信你對使用go優(yōu)雅地撰寫單元測試的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。