首頁 >後端開發 >Golang >如何有效測試 Golang 函數中的參數傳遞?

如何有效測試 Golang 函數中的參數傳遞?

Susan Sarandon
Susan Sarandon原創
2024-12-08 17:52:10405瀏覽

How to Effectively Test Argument Passing in Golang Functions?

測試 Golang 中的參數傳遞

在 Golang 中,將參數傳遞給函數是提供輸入的常見方式。測試參數傳遞的正確性對於確保程式碼的可靠性至關重要。

挑戰

考慮以下程式碼片段:

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
}

將參數-user=bla 傳遞給程式時,它會正確列印「 Your username is 'bla'」。挑戰在於創建一個測試來驗證此行為,而無需每次手動建立和運行程式碼。

嘗試

人們可能會嘗試使用os.Args在測試中提供參數:

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

但是,運行此測試時,結果是:

Your username is "root".
Your username is "root".
--- FAIL: TestArgs (0.00s)
    args_test.go:15: Test failed, expected: 'bla', got:  'root'
FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

解決方案

問題是os.Args 是全域變量,所以["args"] 的初始值被覆蓋測試,影響程式的其他部分。為了解決這個問題,我們可以保留原始值並在測試後恢復它:

oldArgs := os.Args
defer func() { os.Args = oldArgs }()
os.Args = []string{"cmd", "-user=bla"}

// ...

以上是如何有效測試 Golang 函數中的參數傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn