ホームページ > バックエンド開発 > Golang > 単体テストで Go の「flag」パッケージの引数解析を適切にテストするにはどうすればよいですか?

単体テストで Go の「flag」パッケージの引数解析を適切にテストするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-18 10:26:11
オリジナル
400 人が閲覧しました

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

Go で引数の解析をテストする方法

フラグ パッケージを使用してコマンドライン引数を解析する次の Go コードを考えてみましょう。

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 を新しいスライスに設定したことです。引数を関数に渡しません。これを解決するには、次の改訂されたテストで実証されているように、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート