Slide 1

Slide 1 text

外部コマンドの実行を含む関数のテスト 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! まだまだやりたいことはたくさん! 仲間になりませんか!

Slide 16

Slide 16 text

Thank you!