web-dev-qa-db-ja.com

go testのコマンドライン引数を処理する

Goの「テスト」でコマンドライン引数を取得する方法はありますか?
_go test_を呼び出すと、明らかにmainが実行されないため、コマンドライン引数を処理する方法があります。

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

それを行うのは間違っていることであり、単体テストの純粋性に反すると考える人もいるかもしれません。

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

記録のために、私は__test_ファイルの1つにinit()関数を入れ、mainがこのように呼び出されたときにフラグを介して設定される変数を設定することになりました。

18
Ali

私の経験では、環境構成は環境変数に保持するのが最適です。次のようなグローバル変数に依存できます。

var envSetting = os.Getenv("TEST_ENV")

または、フラグの使用が必要な場合は、init()という関数内に初期化コードを配置できます。

func init() {
    flags.Parse()
    myEnv = *envFlag
    // ...
}
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)
    ...
}
_
5
pajato0
os.Args[1] = "-conf=my.conf"
flag.Parse()

構成ファイル名がハードコーディングされていることに注意してください。

4
Jules