Slide 1

Slide 1 text

Go言語で テストしてみた お話 基幹サービス開発部 山澤 沙也加 1

Slide 2

Slide 2 text

Go言語って。。。 2 Googleが開発した プログラミング言語の1つ 2009年にリリースされた 比較的新しい言語 世界中で 人気が高い 簡単な記述で 実装できる

Slide 3

Slide 3 text

◆アジェンダ Go言語でテストするには? テストコードを書いてみよう テスト実行コマンド 少し応用のテスト おまけ:ブラウザテスト 最後に 3

Slide 4

Slide 4 text

Go言語でテストするには? テスト全般を支援するtestingパッケージが標準である → ユニットテスト 、ベンチマークテストをサポート ルール ● パッケージ :testingパッケージをimportする ● ファイル名 :xxx_test.go ● テスト関数名:func TestXxx (t *testing.T) 4

Slide 5

Slide 5 text

構成 ● テスト対象のコードと同じディレクトリに配置 tech_do ┣━ main.go ┗━ hello ┣━ hello.go ┗━ hello_test.go 5 Go言語でテストするには?

Slide 6

Slide 6 text

サンプルコード 6 テストコードを書いてみよう

Slide 7

Slide 7 text

サンプルコード 7 テストコードを書いてみよう 実行結果

Slide 8

Slide 8 text

テストコード 8 テストコードを書いてみよう

Slide 9

Slide 9 text

テスト状態やログの管理に利用できる関数 9 テストコードを書いてみよう Error() Errorf() Fail() FailNow() Failed() Fatal() Fatalf() Log() Logf() Skip() ...etc

Slide 10

Slide 10 text

◆ func (t *T) Log(args ...interface{}) 引数の文字列をエラーログに記録する ◆ func (t *T) Logf(format string, args ...interface{}) フォーマットを指定して、引数の文字列をエラーログに記録する 第一引数 :フォーマット 第二引数~:文字列 → テストが成功したのか失敗したのかは管理していない 10 テストコードを書いてみよう

Slide 11

Slide 11 text

◆ func (t *T) Fail() エラーがあったことを記録する 以降の処理は継続する ◆ func (t *T) FailNow() エラーがあったことを記録する 以降の処理は終了する 11 テストコードを書いてみよう

Slide 12

Slide 12 text

◆ func (t *T) Error(args ...interface{}) エラーがあったことと引数の文字列をエラーログに記録する 以降の処理は継続する ◆ func (t *T) Fatal(args ...interface{}) エラーがあったことと引数の文字列をエラーログに記録する 以降の処理は終了する 12 テストコードを書いてみよう →Log()とFail()を呼び出すことと同じ →Log()とFailNow()を呼び出すことと同じ

Slide 13

Slide 13 text

13 テストコードを書いてみよう ErrorとErrorf FatalとFatalf 【参考】

Slide 14

Slide 14 text

14 関数 結果 処理継続 ログ出力 フォーマット Log - 〇 〇 × Logf - 〇 〇 〇 Fail エラー 〇 × - Error エラー 〇 〇 × Errof エラー 〇 〇 〇 FailNow エラー × × - Fatal エラー × 〇 × Fatalf エラー × 〇 〇 テストコードを書いてみよう 【参考】

Slide 15

Slide 15 text

● go test :テスト実行 ● go test -v :テスト実行(詳細な実行結果出力) ● go test -cover :テスト実行+コードカバレッジ ● go test -cover -v :テスト実行+コードカバレッジ (詳細な実行結果出力) 15 テスト実行コマンド

Slide 16

Slide 16 text

> go test > go test -v 16 テスト実行コマンド テスト成功

Slide 17

Slide 17 text

> go test -cover > go test -cover -v 17 テスト実行コマンド テスト成功

Slide 18

Slide 18 text

テストコード(エラーが出るようにする) 18 テスト実行コマンド

Slide 19

Slide 19 text

> go test > go test -v 19 テスト実行コマンド テスト失敗 → 「-v」の有無に関係なく、Logの内容も出力される

Slide 20

Slide 20 text

パッケージ単位 go test ./hello ● 指定したパッケージにある全ての_test.goを実行 ● 実行時:ルートディレクトリに移動すること テスト関数単位 go test -run TestHello ● 指定したテスト関数を実行 ● 実行時:テストコードのあるディレクトリに移動すること 20 テスト実行コマンド

Slide 21

Slide 21 text

プログラム単位 <テストコード> <テスト対象コード>の順でプログラムを指定 go test hello_test.go hello.go ┗ 実行時:テストコードのあるディレクトリに移動すること go test hello/hello_test.go hello/hello.go ┗ 実行時:ルートディレクトリに移動すること 21 テスト実行コマンド

Slide 22

Slide 22 text

レシーバ付き関数のテスト ● テスト関数名:func Test{レシーバ型}_Xxx (t *testing.T) サブテスト ● func (t *T) Run(name string, f func(t *T)) bool 22 少し応用のテスト

Slide 23

Slide 23 text

23 少し応用のテスト サンプルコード

Slide 24

Slide 24 text

24 少し応用のテスト テストコード:レシーバ、サブテスト

Slide 25

Slide 25 text

25 少し応用のテスト 実行結果

Slide 26

Slide 26 text

サブテスト単位 go test -v -run <関数名>/<サブテストの名前> ● 指定したサブテストのみ実行 26 少し応用のテスト

Slide 27

Slide 27 text

前処理・後処理 ● func TestMain(m *testing.M) ● m.Run()を書くことでテスト関数が実行される ┗ m.Run()の数 = テスト関数が実行される回数 ● m.Run()を書かないとテスト関数は実行されない 27 少し応用のテスト

Slide 28

Slide 28 text

サブテストの並列処理 ● func (t *T) Parallel() ● 対象のサブテスト内にt.Parallel()を書くことで並列処理される ● 並列処理する複数のサブテストはt.Run(name, func)でラップする 28 少し応用のテスト

Slide 29

Slide 29 text

29 少し応用のテスト テストコード:前処理・後処理、並列処理 前処理 サブテスト実行 後処理

Slide 30

Slide 30 text

30 少し応用のテスト 実行結果

Slide 31

Slide 31 text

31 おまけ

Slide 32

Slide 32 text

Selenium WebDriver ● ブラウザでWebアプリケーションをテストするツール ● 環境変数でパスを通すこと agouti ● WebDriverクライアント ● テストフレームワーク 32 ブラウザテスト Windows用のコマンド(chocolatey) Mac用のコマンド(Homebrew)

Slide 33

Slide 33 text

基本の書き方 33 ブラウザテスト

Slide 34

Slide 34 text

テストしたい処理【例:ログイン】 34 ブラウザテスト

Slide 35

Slide 35 text

● Go言語はテストコードもシンプルで直観的 ● テストのサポートが充実している ● Selenium WebDriver + agoutiでブラウザテストも簡単 何かプログラムを実装する際には、 テストコード含めてGo言語で実装してみてください! 35 最後に

Slide 36

Slide 36 text

36 ご清聴ありがとうございました (*^_^*)

Slide 37

Slide 37 text

37 参考文献 ● 「testing - The Go Programming Language」 https://golang.org/pkg/testing/ ● 「agouti - GoDoc」 https://godoc.org/github.com/sclevine/agouti ● 「Agouti」 https://agouti.org/ ● 第2回Goハンズオン資料