Go でのコマンド ライン フラグのテスト
この記事では、Golang でのコマンド ライン フラグのテスト手法について説明します。具体的には、列挙型に対してフラグ値を単体テストする方法を検討します。
問題ステートメント
次のコードが与えられたとします。
<code class="go">// Define flag for output format var formatType string // Constants representing valid format types const ( text = "text" json = "json" hash = "hash" ) // Initialize flags func init() { flag.StringVar(&formatType, "format", "text", "Desired output format") } // Main function func main() { flag.Parse() }</code>
We -format フラグの値が事前定義された定数の 1 つと一致することを確認する単体テストを作成したいと考えています。
カスタム フラグ タイプを使用したソリューション
詳細なフラグをテストするには柔軟な方法で、Value インターフェイスを実装するカスタム タイプで flag.Var 関数を利用できます。
<code class="go">package main import ( "errors" "flag" "fmt" ) // Custom type representing format type type formatType string // String() method for Value interface func (f *formatType) String() string { return fmt.Sprint(*f) } // Set() method for Value interface func (f *formatType) Set(value string) error { if len(*f) > 0 && *f != "text" { return errors.New("format flag already set") } if value != "text" && value != "json" && value != "hash" { return errors.New("Invalid Format Type") } *f = formatType(value) return nil } // Initialize flag with custom type func init() { typeFlag := "text" // Default value usage := `Format type. Must be "text", "json" or "hash". Defaults to "text".` flag.Var(&typeFlag, "format", usage) } // Main function func main() { flag.Parse() fmt.Println("Format type is", typeFlag) } </code>
このソリューションでは、flag.Var は、Value インターフェイスを満たすカスタム タイプへのポインタを受け取ります。 Set メソッド内で独自の検証ロジックを定義できます。
カスタム フラグ タイプの単体テスト
カスタム フラグ タイプの単体テストは次のように記述できます。
<code class="go">// Test unit validates that the format flag is within the enumeration func TestFormatFlag(t *testing.T) { testCases := []struct { input string expectedErr string }{ {"text", ""}, {"json", ""}, {"hash", ""}, {"", "Invalid Format Type"}, {"xml", "Invalid Format Type"}, } for _, tc := range testCases { t.Run(tc.input, func(t *testing.T) { args := []string{"-format", tc.input} flag.CommandLine = flag.NewFlagSet("test", flag.PanicOnError) err := flag.CommandLine.Parse(args) if err != nil && err.Error() != tc.expectedErr { t.Errorf("Unexpected error: %v", err) return } }) } }</code>
以上がGo で列挙型に対してコマンド ライン フラグ値を単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。