外部コマンドの実行を含む関数のテストYu TanakaKanmu, Inc.Go Conference 2022 SpringApril 23,2022
View Slide
Copyright Kanmu, Inc. All right reserved. 2田中 悠(ぽんず)@pongzu@_pongzu自己紹介
Copyright Kanmu, Inc. All right reserved.バンドルカードとpoolを作ってます
Copyright Kanmu, Inc. All right reserved.外部コマンドをコード内から実行する1
Copyright Kanmu, Inc. All right reserved.interfaceを用いたモック1exec.Command()呼び出しからcmd.Output()の実行まで、まるごとモックすればよい?
Copyright Kanmu, Inc. All right reserved.interfaceを用いたモック61● Executor interface を定義● Executorを受け取るrunLs()を定義● テスト時はモックのExecutorに差し替える書くこと多すぎるし、複雑すぎるな...
Copyright Kanmu, Inc. All right reserved.exec_test.goの実装1exec.Command()にビルドしたテストバイナリ自身を渡して実行バイナリ自体を差し替える
Copyright Kanmu, Inc. All right reserved.exec_test.goの実装91https://pkg.go.dev/os/execを参照
Copyright Kanmu, Inc. All right reserved.exec_test.goの実装101● os.Args[0]は実行コマンドのパスが入る○ go test実行時はビルドしたテストバイナリ自体● exec.Commandにos.Args[0]を渡すと外部コマンドとしてテストバイナリ自身を実行できるhttps://pkg.go.dev/os/execを参照
Copyright Kanmu, Inc. All right reserved.exec_test.goの実装111● テスト実行時に-test.run=オプションを与えて実行処理を絞ることができる● cmd.Output()で実行されるのはテストバイナリ自体で、その中で呼ばれるのはTestHelperProcess()https://pkg.go.dev/os/execを参照
Copyright Kanmu, Inc. All right reserved.exec_test.goの実装121https://pkg.go.dev/os/execを参照● モックしたいコマンド名とその引数を取得● コマンド別に任意の処理を書く● helperCommand()でセットしたテストバイナリ自身の呼び出し時にここに書いた処理が実行される
最後に
Copyright Kanmu, Inc. All right reserved.参考資料/使ったコード等● 今回使ったコード○ https://github.com/pongzu/testing-exec-sample● 参考資料/コード○ https://npf.io/2015/06/testing-exec-command○ https://pkg.go.dev/os/exec
Copyright Kanmu, Inc. All right reserved.We are hiring!まだまだやりたいことはたくさん!仲間になりませんか!
Thank you!