首頁 > 後端開發 > Golang > 如何在單元測試中正確測試Go的「flag」包參數解析?

如何在單元測試中正確測試Go的「flag」包參數解析?

Patricia Arquette
發布: 2024-12-18 10:26:11
原創
399 人瀏覽過

How to Properly Test Go's `flag` Package Argument Parsing in Unit Tests?

如何在 Go 中測試參數解析

考慮以下 Go 程式碼,它使用 flag 套件解析命令列參數:

package main

import (
    "flag"
    "fmt"
)

func main() {
    passArguments()
}

func passArguments() string {
    username := flag.String("user", "root", "Username for this server")
    flag.Parse()
    fmt.Printf("Your username is %q.", *username)

    usernameToString := *username
    return usernameToString
}
登入後複製

為了測試這個函數,我們可以將一個參數傳遞給編譯後的程式碼,如圖所示下面:

./args -user=bla
登入後複製

這應該會產生輸出:

Your username is "bla"
登入後複製

但是,如果我們嘗試使用以下測試來測試此行為:

package main

import (
    "os"
    "testing"
)

func TestArgs(t *testing.T) {
    expected := "bla"
    os.Args = []string{"-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}
登入後複製

我們收到一個錯誤:

FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s
登入後複製

此失敗的原因是簡單地將os.Args 設定為新的slice 不將參數傳遞給函數。為了解決這個問題,我們需要確保os.Args 中的第一個值是可執行檔本身(的路徑),如本修訂後的測試所示:

func TestArgs(t *testing.T) {
    expected := "bla"
    oldArgs := os.Args
    defer func() { os.Args = oldArgs }()
    os.Args = []string{"cmd", "-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}
登入後複製

透過延遲os.Args的恢復恢復到其原始狀態,我們可以確保測試不會幹擾其他測試,這些測試可能正在檢查呼叫go test 時傳遞的真實參數。

以上是如何在單元測試中正確測試Go的「flag」包參數解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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