外部コマンドの実行を含む関数のテスト
Yu Tanaka
Kanmu, Inc.
Go Conference 2022 Spring
April 23,2022
Slide 2
Slide 2 text
Copyright Kanmu, Inc. All right reserved. 2
田中 悠(ぽんず)
@pongzu
@_pongzu
自己紹介
Slide 3
Slide 3 text
Copyright Kanmu, Inc. All right reserved.
バンドルカードとpoolを作ってます
Slide 4
Slide 4 text
Copyright Kanmu, Inc. All right reserved.
外部コマンドをコード内から実行する
1
Slide 5
Slide 5 text
Copyright Kanmu, Inc. All right reserved.
interfaceを用いたモック
1
exec.Command()呼び出しから
cmd.Output()の実行まで、まるご
とモックすればよい?
Slide 6
Slide 6 text
Copyright Kanmu, Inc. All right reserved.
interfaceを用いたモック
6
1
● Executor interface を定義
● Executorを受け取るrunLs()を定義
● テスト時はモックのExecutorに差し替える
書くこと多すぎるし、複雑
すぎるな...
Slide 7
Slide 7 text
Copyright Kanmu, Inc. All right reserved.
interfaceを用いたモック
1
exec.Command()呼び出しから
cmd.Output()の実行まで、まるご
とモックすればよい?
Slide 8
Slide 8 text
Copyright Kanmu, Inc. All right reserved.
exec_test.goの実装
1
exec.Command()にビルドした
テストバイナリ自身を渡して実
行バイナリ自体を差し替える
Slide 9
Slide 9 text
Copyright Kanmu, Inc. All right reserved.
exec_test.goの実装
9
1
https://pkg.go.dev/os/execを参照
Slide 10
Slide 10 text
Copyright Kanmu, Inc. All right reserved.
exec_test.goの実装
10
1
● os.Args[0]は実行コマンドのパスが入る
○ go test実行時はビルドしたテストバイナリ自体
● exec.Commandにos.Args[0]を渡すと外部コマンド
としてテストバイナリ自身を実行できる
https://pkg.go.dev/os/execを参照
Slide 11
Slide 11 text
Copyright Kanmu, Inc. All right reserved.
exec_test.goの実装
11
1
● テスト実行時に-test.run=オプションを与えて実行
処理を絞ることができる
● cmd.Output()で実行されるのはテストバイナリ自体
で、その中で呼ばれるのはTestHelperProcess()
https://pkg.go.dev/os/execを参照
Slide 12
Slide 12 text
Copyright Kanmu, Inc. All right reserved.
exec_test.goの実装
12
1
https://pkg.go.dev/os/execを参照
● モックしたいコマンド名とその引数を取得
● コマンド別に任意の処理を書く
● helperCommand()でセットしたテストバイ
ナリ自身の呼び出し時にここに書いた処理
が実行される
Slide 13
Slide 13 text
最後に
Slide 14
Slide 14 text
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
Slide 15
Slide 15 text
Copyright Kanmu, Inc. All right reserved.
We are hiring!
まだまだやりたいことはたくさん!
仲間になりませんか!