欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言工程實踐單元測試基準測試示例詳解

 更新時間:2023年02月05日 14:22:32   作者:啵啵腸  
這篇文章主要為大家介紹了Go語言工程實踐單元測試基準測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

測試的出現是為了避免項目中出現重大事故

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

測試

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

單元測試

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

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

Golang單元測試對文件名和方法名,參數都有很嚴格的要求

  • 文件名必須以xx_test.go命名
  • 方法必須是Test[^a-z]開頭
  • 方法參數必須t *testing.T
  • 初始化邏輯放到TestMain中
  • 使用go test執(zhí)行單元測試

演示

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

判斷函數測試值與期望值是否一致

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"
}

覆蓋率

覆蓋率出現的目的:

  • 衡量代碼是否經過了足夠的測試
  • 評價項目的測試水準
  • 評估項目是否達到了高水準測試等級

通過go test命令測試函數的覆蓋率

// 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%+

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

對于上述案例代碼而言

應出現成績大于等于60 和小于60的測試用力

測試單元粒度足夠小,函數單一職責

依賴

  • 冪等:重復運行同一個case,結果與之前一致
  • 穩(wěn)定:指單元測試相互隔離,可以獨立運行

文件處理

當測試文件被修改后,可能會導致測試失敗或錯誤率增高

從而出現了Mock函數

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包能夠將內存中函數的地址替換為運行時函數的地址,將待打樁函數或方法的實現跳轉。

Mock函數不僅可以為一個函數打樁 也可以為一個方法打樁

// 用函數A去替換函數B,B就是原函數,A就是打樁函數
func Patch(target, replacement interface{}) *PatchGuard {
    // target就是原函數,replacement就是打樁函數
    t := reflect.ValueOf(target)
    r := reflect.ValueOf(replacement)
    patchValue(t, r)
    return &PatchGuard{t, r}
}
func Unpatch(target interface{}) bool {
    // 保證了在測試結束之后需要把這個包卸載掉
    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
// 這樣整個測試函數就擺脫了本地文件的束縛和依賴

基準測試

基準測試是指測試一段程序的性能及耗費CPU的程度;

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

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

  • 優(yōu)化代碼,需要對當前代碼分析
  • 內置的測試框架提供了基準測試的能力

小結

對于今日課程而言,我將其劃分成測試的重要性與分類。 當前課程余下部分為項目實戰(zhàn),該部分內容選擇了放置于項目筆記。 如果筆記中有錯誤的地方也希望掘友們可以及時的提出糾正,更多關于Go語言單元測試基準測的資料請關注腳本之家其它相關文章!

相關文章

  • go流程控制代碼詳解

    go流程控制代碼詳解

    這篇文章主要介紹了go流程控制,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • 基于golang uint8、int8與byte的區(qū)別說明

    基于golang uint8、int8與byte的區(qū)別說明

    這篇文章主要介紹了基于golang uint8、int8與byte的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go語言學習otns示例分析

    Go語言學習otns示例分析

    這篇文章主要為大家介紹了Go語言學習otns示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 一篇文章搞懂Go語言中的Context

    一篇文章搞懂Go語言中的Context

    這篇文章主要介紹了一篇文章搞懂Go語言中的Context,Context攜帶一個截止日期、一個取消信號和其他跨越API邊界的值。上下文的方法可以被多個gor例程同時調用
    2022-07-07
  • Go語言中你所不知道的位操作用法

    Go語言中你所不知道的位操作用法

    位運算可能在平常的編程中使用的并不多,但涉及到底層優(yōu)化,一些算法及源碼可能會經常遇見。下面這篇文章主要給大家介紹了關于Go語言中你所不知道的位操作用法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • go語言中的json與map相互轉換實現

    go語言中的json與map相互轉換實現

    本文主要介紹了go語言中的json與map相互轉換實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Golang?websocket協議使用淺析

    Golang?websocket協議使用淺析

    這篇文章主要介紹了Golang?websocket協議的使用,WebSocket是一種新型的網絡通信協議,可以在Web應用程序中實現雙向通信,感興趣想要詳細了解可以參考下文
    2023-05-05
  • Golang?依賴注入經典解決方案uber/fx理論解析

    Golang?依賴注入經典解決方案uber/fx理論解析

    這篇文章主要為大家介紹了Golang依賴注入經典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang中常見加密算法的總結

    Golang中常見加密算法的總結

    這篇文章主要為大家詳細介紹了Golang中常見的一些加密算法的實現,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Go語言操作mysql數據庫簡單例子

    Go語言操作mysql數據庫簡單例子

    這篇文章主要介紹了Go語言操作mysql數據庫簡單例子,本文包含插入數據和查詢代碼實例,需要的朋友可以參考下
    2014-10-10

最新評論