溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言單元測試和基準(zhǔn)測試實例代碼分析

發(fā)布時間:2023-02-07 09:26:28 來源:億速云 閱讀:137 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Go語言單元測試和基準(zhǔn)測試實例代碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Go語言單元測試和基準(zhǔn)測試實例代碼分析”吧!

    背景

    測試的出現(xiàn)是為了避免項目中出現(xiàn)重大事故

    測試是避免事故的最后一道屏障

    測試

    單元測試的覆蓋率在一定程度上而言,決定了代碼的質(zhì)量

    單元測試

    Go語言單元測試和基準(zhǔn)測試實例代碼分析

    通過測試單元的輸出與期望值進行校對從而驗證代碼的正確性,從而保證新舊代碼的互不影響與程序的正常運行。

    進而單元測試較于編譯更易于在較短的周期內(nèi)發(fā)現(xiàn)和定位代碼中的錯誤使損失最小化從而提升效率。所以寫單元測試是很有必要的。

    Golang單元測試對文件名和方法名,參數(shù)都有很嚴(yán)格的要求。

    • 文件名必須以xx_test.go命名

    • 方法必須是Test[^a-z]開頭

    • 方法參數(shù)必須t *testing.T

    • 初始化邏輯放到TestMain中

    • 使用go test執(zhí)行單元測試

    演示

    通過第三方包assert演示單元測試

    判斷函數(shù)測試值與期望值是否一致

    import(
        "github.com/stretchr/testify/assert"
        "testing"
    )
    func TestHelloTom(t *testing.T) {
        output := HelloTom()
        expectOutput := "Tom"
        assert.Equal(t, expectOutput, output)
    }
    func HelloTom() string {
        return "Tom"
    }

    覆蓋率

    覆蓋率出現(xiàn)的目的:

    • 衡量代碼是否經(jīng)過了足夠的測試

    • 評價項目的測試水準(zhǔn)

    • 評估項目是否達到了高水準(zhǔn)測試等級

    通過go test命令測試函數(shù)的覆蓋率

    // judgment.go
    func JudgePassLine(score int16) bool {
        if score >= 60 {
            return true
        }
        else {
            return false
        }
    }
    // judgment_test.go
    func TestJudgePassLineTrue(t *testing.T) {
        isPass := JudgeePassLine(70)
        assert.Equal(t, true, isPass)
    }
    func TestJudgePassLineFalse(t *testing.T) {
        isPass := JudgeePassLine(50)
        assert.Equal(t, false, isPass)
    }
    /*
     通過go test 命令測試覆蓋率
     go test judgment_test.go judgment.go --cover
    */

    一般覆蓋率:50%~60%,較高覆蓋率:80%+

    測試分支相互獨立、全面覆蓋

    對于上述案例代碼而言

    應(yīng)出現(xiàn)成績大于等于60 和小于60的測試用力

    測試單元粒度足夠小,函數(shù)單一職責(zé)

    依賴

    Go語言單元測試和基準(zhǔn)測試實例代碼分析

    • 冪等:重復(fù)運行同一個case,結(jié)果與之前一致

    • 穩(wěn)定:指單元測試相互隔離,可以獨立運行

    文件處理

    當(dāng)測試文件被修改后,可能會導(dǎo)致測試失敗或錯誤率增高

    從而出現(xiàn)了Mock函數(shù)

    func ReadFirstLine() string {
        open, err := os.Open("log") // 打開一個文件
        defer open.Close()
        if err != nil {
            return ""
        }
        scanner := bufio.NewScanner(open) // 對每行進行遍歷
        for scanner.Scan() {
            return scanner.Text()
        }
        return ""
    }
    func ProcessFirstLine() string {
        line := ReadFirstLine()
        destLine := strings.ReplaceAll(line, "11", "00") // 替換11為00
        return destLine
    }
    func TestProcessFirstLine(t *testing.T) { // 執(zhí)行單元測試
        firstLine := ProcessFirstLine()
        assert.Equal(t, "line00", firstLine)
    }

    Mock

    monkey: github.com/bouk/monkey 這是一個開源的mock測試庫,可以對method或者實例的方法進行mock

    Monkey Patch的作用域在Runtime, 運行時通過Go的unsafe包能夠?qū)?nèi)存中函數(shù)的地址替換為運行時函數(shù)的地址,將待打樁函數(shù)或方法的實現(xiàn)跳轉(zhuǎn)。

    Mock函數(shù)不僅可以為一個函數(shù)打樁 也可以為一個方法打樁

    // 用函數(shù)A去替換函數(shù)B,B就是原函數(shù),A就是打樁函數(shù)
    func Patch(target, replacement interface{}) *PatchGuard {
        // target就是原函數(shù),replacement就是打樁函數(shù)
        t := reflect.ValueOf(target)
        r := reflect.ValueOf(replacement)
        patchValue(t, r)
        return &PatchGuard{t, r}
    }
    func Unpatch(target interface{}) bool {
        // 保證了在測試結(jié)束之后需要把這個包卸載掉
        return unpatchValue(reflect.ValueOf(target))
    }
    func TestProcessFirstLineWithMock(t *testing.T) {
        monkey.Patch(ReadFirstLine, func() string {
            return "line110"
        })
        defer monkey.Unpatch(ReadFirstLine)
        line := ProcessFirstLine()
        assert.Equal(t, "line000", line)
    }
    // 通過patch對ReadFirstLine進行打樁mock,默認返回line110,通過defer卸載mock
    // 這樣整個測試函數(shù)就擺脫了本地文件的束縛和依賴

    基準(zhǔn)測試

    基準(zhǔn)測試是指測試一段程序的性能及耗費CPU的程度;

    在實際的項目開發(fā)中,經(jīng)常會遇到代碼性能瓶頸,為了定位問題,經(jīng)常要對代碼做性能分;

    這時就用到了基準(zhǔn)測試,其使用方法與單元測試類似。

    • 優(yōu)化代碼,需要對當(dāng)前代碼分析

    • 內(nèi)置的測試框架提供了基準(zhǔn)測試的能力

    到此,相信大家對“Go語言單元測試和基準(zhǔn)測試實例代碼分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(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)容。

    go
    AI