首頁 > 後端開發 > Golang > 如何使用 os.Exit() 實現 Go 程式碼的準確測試覆蓋率?

如何使用 os.Exit() 實現 Go 程式碼的準確測試覆蓋率?

DDD
發布: 2024-12-23 14:39:22
原創
327 人瀏覽過

How Can I Achieve Accurate Test Coverage for Go Code Using `os.Exit()`?

使用覆蓋資訊測試Go 中的os.Exit 場景(coveralls.io/Goveralls)

這個問題涉及涉及os.Exit 的測試場景。 Go 中的 Exit(),特別是如何捕捉這些場景的覆蓋資訊。提供的範例程式碼演示了重新執行方法,但它受到覆蓋工具和脆弱性的限制。

覆蓋挑戰

一個困難是覆蓋框架,例如coveralls.io 可能不會記錄引發 os.Exit() 的測試的覆蓋範圍。這是因為重新執行測試二進位檔案時,不會套用覆蓋率偵測。

修改的重新執行方法

為了解決此問題,修改了重新執行方法可以採用exec方法。原始程式碼被重構以將 os.Exit 提取為名為 osExit 的變數。然後,測試程式碼將 osExit 替換為記錄退出程式碼的模擬函數。這允許捕獲 osExit 調用的覆蓋資訊。

外部調用的覆蓋

可以應用相同的技術來覆蓋對 log.Fatalf() 等函數的調用,它間接調用 os.Exit。 logFatalf 函數被替換為模擬函數,該函數記錄訊息格式和傳遞給它的參數。這樣可以確保覆蓋外部函數呼叫 os.Exit 的場景。

範例

修改後的程式碼和測試如下:

// bar.go
package foo

import (
    "fmt"
    "os"
)

var osExit = os.Exit

func Crasher() {
    fmt.Println("Going down in flames!")
    osExit(1)
}
登入後複製
// bar_test.go
package foo

import (
    "reflect"
    "testing"
)

var logFatalf = log.Fatalf

func TestCrasher(t *testing.T) {
    // Save original functions and restore at the end
    oldOsExit := osExit
    oldLogFatalf := logFatalf
    defer func() {
        osExit = oldOsExit
        logFatalf = oldLogFatalf
    }()

    // Mock osExit
    var got int
    myExit := func(code int) {
        got = code
    }
    osExit = myExit

    // Mock logFatalf
    var gotFormat string
    var gotV []interface{}
    myFatalf := func(format string, v ...interface{}) {
        gotFormat, gotV = format, v
    }
    logFatalf = myFatalf

    // Run test
    Crasher()

    // Check results
    exp := 1
    if got != exp {
        t.Errorf("Expected exit code: %d, got: %d", exp, got)
    }

    expFormat, expV := "Exiting with code: %d", []interface{}{1}
    if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) {
        t.Error("Something went wrong")
    }
}
登入後複製

透過隔離與退出相關的功能並使用模擬函數,os.Exit 和觸發的外部函數呼叫os.Exit 可以在Go 測試中覆寫。這種方法確保了涉及進程終止的場景的準確覆蓋率報告。

以上是如何使用 os.Exit() 實現 Go 程式碼的準確測試覆蓋率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板