ホームページ >バックエンド開発 >Golang >Golang 関数で引数の受け渡しを効果的にテストするにはどうすればよいですか?

Golang 関数で引数の受け渡しを効果的にテストするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-08 17:52:10407ブラウズ

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 を渡すと、「あなたのユーザー名は 'bla' です。」と正しく出力されます。課題は、コードを毎回手動で構築して実行することなく、この動作を検証するテストを作成することです。

The Attempt

One might尝试 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。