成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用go優(yōu)雅地撰寫單元測(cè)試的方法-創(chuàng)新互聯(lián)

小編給大家分享一下使用go優(yōu)雅地撰寫單元測(cè)試的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),普安網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:普安等地區(qū)。普安做網(wǎng)站價(jià)格咨詢:18982081108

                                                       

背景

剛剛加入一個(gè)年輕的小組,代碼中的單元測(cè)試還沒有來得及寫,leader希望我通過單元測(cè)試來熟悉項(xiàng)目的業(yè)務(wù)邏輯。但是,代碼量實(shí)在有點(diǎn)多,高效的完成單元測(cè)試成為首要目標(biāo)。

實(shí)現(xiàn)原理

單元測(cè)試測(cè)用的是testify的測(cè)試框架,使用起來非常方便,具體的基礎(chǔ)使用方法可以參考中文testify博客以及官方文檔。

項(xiàng)目中的應(yīng)用

初始化單元測(cè)試

在一個(gè)復(fù)雜的Web項(xiàng)目中,測(cè)試某一模塊的功能往往需要先對(duì)這一模塊所使用到的服務(wù)進(jìn)行初始化,我們將初始化函數(shù)以及初始化函數(shù)所使用到的參數(shù)都放在同一個(gè)單元測(cè)試包下,例如對(duì)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ù),在測(cè)試包的初始化函數(shù)中調(diào)用即可}func CloseDB() error{
    return db.Close()}

我們?cè)诹硪粋€(gè)contant包下存放對(duì)應(yīng)的參數(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")

進(jìn)行單元測(cè)試

以下以對(duì)數(shù)據(jù)庫的操作為例
單元測(cè)試主要由三部分組成:
第一部分為固定寫法

type ActionLogRepo struct {
    basetest.BaseSuite}

第二部分為對(duì)Register進(jìn)行初始化,Register函數(shù)可以傳入四個(gè)參數(shù)fun1,fun2,fun3,fun4
fun1:在該測(cè)試文件中的最開始執(zhí)行一次。
fun2:在每個(gè)單元測(cè)試前都執(zhí)行一次。
fun3:在每個(gè)單元測(cè)試后都執(zhí)行一次。
fun4:在該測(cè)試文件中的最終執(zhí)行一次。
根據(jù)需求,我們需要在所有單元測(cè)試開始前執(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)}

第三部分,進(jìn)行單元測(cè)試,我們先在數(shù)據(jù)庫中建立對(duì)應(yīng)的數(shù)據(jù),然后調(diào)用需要單元測(cè)試的函數(shù)進(jìn)行對(duì)該數(shù)據(jù)的操作,之后使用assert對(duì)該結(jié)果進(jìn)行驗(yàn)證,最后要記得刪除掉單元測(cè)試的記錄。

func (suite *ActionLogRepo) TestActionLog() {
    repo := repository.NewRepository()//獲取數(shù)據(jù)庫
    actionLog := &model.ActionLogTab{XXXXXX}
    err := CreateActionLog(actionLog)//創(chuàng)建測(cè)試的數(shù)據(jù)記錄
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要測(cè)試的函數(shù)
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//驗(yàn)證函數(shù)的正確性

    err = repo.MerchantDB().Delete(actionLog).Error//刪除掉測(cè)試的數(shù)據(jù)庫記錄
    assert.Nil(suite.T(),err)}

最終的測(cè)試文件結(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)建測(cè)試的數(shù)據(jù)記錄
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要測(cè)試的函數(shù)
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//驗(yàn)證函數(shù)的正確性

    err = repo.MerchantDB().Delete(actionLog).Error//刪除掉測(cè)試的數(shù)據(jù)庫記錄
    assert.Nil(suite.T(),err)}

看完了這篇文章,相信你對(duì)使用go優(yōu)雅地撰寫單元測(cè)試的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

分享標(biāo)題:使用go優(yōu)雅地撰寫單元測(cè)試的方法-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article16/jgegg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、App開發(fā)、品牌網(wǎng)站制作面包屑導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
巨野县| 阿克陶县| 新安县| 牡丹江市| 德钦县| 仁化县| 阳信县| 衡水市| 玛多县| 富平县| 如皋市| 石林| 安顺市| 广南县| 海阳市| 五峰| 涿州市| 丹棱县| 城市| 抚州市| 沙雅县| 苏尼特左旗| 竹北市| 永年县| 克什克腾旗| 尼勒克县| 鄱阳县| 南陵县| 德兴市| 宁国市| 东宁县| 大同县| 甘肃省| 图木舒克市| 景德镇市| 武夷山市| 崇明县| 米林县| 苍南县| 仁怀市| 灌南县|