27

go "tests" でコマンドライン引数を取得する方法はあります
go test?main

1 つの方法は、flagsパッケージを使用して、テスト対象の各テストまたは関数でコマンド ライン引数を確認することですが、これは、単に実行する方法とは異なり、非常に多くの場所でこれを行う必要がある場合には理想的ではありません。mainアプリケーションを実行するとき。

それは間違ったことであり、ユニットテストの純粋さに反すると思うかもしれません:

  1. すべてのテストが単体テストではない
  2. 「ENV」変数に依存せず、実際にコマンドラインで引数としてものを渡すことは非常に機能的です。

記録init()として、ファイルの 1 つに関数を_test配置し、メインがこの方法で呼び出されたときにフラグを介して設定される変数を設定しました。

4

4 に答える 4

9

別のアプローチはmain()、引数が によって処理された後に別の関数を呼び出すだけのスタブにすることflag.Parse()です。次に例を示します。

var flagvar int
func init() {
    flag.IntVar(&flagvar, "flagname", 1234, "help for flagname")
}

func main() {
    flag.Parse()
    submain(flag.Args)
}

func submain(args []string) {
   ...
}

submain(...)次に、テストで、コマンド ラインでのフラグと引数の確立をシミュレートする呼び出しの前に、フラグ変数を設定し、引数を確立できます。このアプローチを使用すると、実際にコマンド ラインを使用せずにテスト カバレッジを最大化できます。たとえば、main_test.go では、次のように記述できます。

func TestSomething(t *testing.T) {
    flagvar = 23
    args := []string{"a", "b", "c"}
    submain(args)
    ...
}
于 2015-10-24T10:36:44.283 に答える
6
os.Args[1] = "-conf=my.conf"
flag.Parse()

Notice that the config file name is hard-coded.

于 2015-02-12T08:11:34.883 に答える