Goの「テスト」でコマンドライン引数を取得する方法はありますか?
_go test
_を呼び出すと、明らかにmain
が実行されないため、コマンドライン引数を処理する方法があります。
1つの方法は、flags
パッケージを使用して、テスト対象の各テストまたは関数でコマンドライン引数を確認することですが、これを行う必要があるのは理想的ではありません。アプリケーションを実行するときに、main
でそれを実行します。
それを行うのは間違っていることであり、単体テストの純粋性に反すると考える人もいるかもしれません。
記録のために、私は__test
_ファイルの1つにinit()
関数を入れ、mainがこのように呼び出されたときにフラグを介して設定される変数を設定することになりました。
私の経験では、環境構成は環境変数に保持するのが最適です。次のようなグローバル変数に依存できます。
var envSetting = os.Getenv("TEST_ENV")
または、フラグの使用が必要な場合は、init()という関数内に初期化コードを配置できます。
func init() {
flags.Parse()
myEnv = *envFlag
// ...
}
別の方法は、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)
...
}
_
os.Args[1] = "-conf=my.conf"
flag.Parse()
構成ファイル名がハードコーディングされていることに注意してください。