SlideShare a Scribd company logo
1 of 28
Download to read offline
Goとテスト
2015/09/26(土)
@Testing Framework Meeting
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0
Attributions license.
アジェンダ
● 自己紹介
● Goとは?
● go testとtestingパッケージ
● Goのコンセプトとテスト
● テストツールを言語標準で用意する理由
● まとめ
● おまけ
自己紹介
KLab株式会社
KLabGames事業本 エンジニア
上田拓也
twitter: @tenntenn
■ 好きな言語
Go, JavaScript, Lua
■ 業務
モバイルオンラインゲームの開発(クライアントサイド)
■ Goコミュニティでの活動
Go歴 5年目
Go Conference (GoCon) 主催
Goとは?
Googleが開発しているプログラミング言語
■ 特徴
● 並行プログラミング
● 豊富なライブラリ群
● 強力でシンプルな言語設計と文法
● クロスコンパイル/シングルバイナリ
● go tool
go testとtestingパッケージ
go test
■ testを行うためコマンド
 _testというサフィックスの付いた
 goファイルを対象にしてテストを実行
# mypkgのテスト行う
$ go test mypkg
ok mypkg 0.007s
# 失敗する場合
$ go test mypkg
--- FAIL: TestHex_String (0.00s)
hex_test.go:11: expect="a" actual="A"
FAIL
FAIL mypkg 0.008s
hex.go ⇒ hex_test.go
go testのオプション(一部)
■ -v
詳細を表示する。
■ -cpu
実行する並列度を指定する。
複数のコアを使ったテストができる。
■ -race
データの競合が起きないかテストする。
■ -cover
カバレッジを取得する。
testingパッケージ
■ testを行うため機能を提供するパッケージ
 *testing.T型のメソッド使う。
package mypkg_test
import "testing"
func TestHex_String(t *testing.T) {
expect := "a"
actual := mypkg.Hex(10).String()
if actual != expect {
t.Errorf(`expect="%s" actual="%s"`, expect, actual)
}
}
type Hex int
func (h Hex) String() string {
return fmt.Sprintf("%x", int(h))
}
testingパッケージでできること
■ 失敗理由を出力してテストを失敗させる
Error, Errorf, Fatal, Fatalf
■ テストの並列実行
Parallel
go testの-parallelオプションで並列数を指定
■ ベンチマーク
 *testing.B型を使う
■ ブラックボックステスト
testing/quickパッケージ
みんなの知ってるアレはないのか?
■ アサーションはない
自動でエラーメッセージを作るのではなく,
ひとつずつErrorfを使って自前で作る
■ テストはGoで書く
テストのための新しいミニ言語を作らない
■ 比較演算子だけはツライのでは?
reflect.DeepEqualを使うと良い
 
かなり薄いテストパッケージ
そうだ!
テスティングフレームワークを作ろう!
まずはGoのコンセプトを知ろう
Goのコンセプト
■ 実現する手段は少ないほうが良い
 機能が増えると複雑さが増える。
■ 暗黙的で曖昧な記述をさせない
 エラーにつながる,暗黙の型変換や
 不使用の変数等の宣言は許さない。
■ 不要なものは避ける
 不要な型の宣言の排除など,
 タイプ数をできるだけ減らすように。
■ コンセプトに一貫性を持たせる
 コンセプトにずれる言語仕様は入れない。
“Simplicity is Complicated” by Rob Pike
シンプルさと強力さ
■ シンプルな機能を組み合わせる
 シンプルな機能を組み合わせて,複雑な問題に対処する
  ⇒シンプルだが強力さも十分ある
シンプル
簡潔さ
強力さ
表現力
品質の良いコードが作りやすい
Goのコードの品質を高める要素
■ シンプルな文法と言語設計
 可読性の高い文法と複雑になりにくい言語仕様。
■ 型階層がない
 複雑な型の階層が存在せず不要な型ができにくい。
■ コンパイルによるエラー検出
 静的型付け言語なのでバグがコンパイル時に分かる。
 バグになり得る箇所がコンパイルエラーになる。
 (型不一致,未使用の変数など)
■ コードフォーマッタ
 標準のコードフォーマッタ(gofmt)がある。
■ テスト
 標準のテストツール(go test)がある
コンパイルエラーになるもの(1)
■ 型の不一致
var n int = 100
var m float64 = 1.5
// エラー
var a int = n + m
// OK
var b int = n + int(m)
コンパイルエラーになるもの(2)
■ 未使用の変数/パッケージ
import (
"fmt" // エラー
_ "io" // OK
)
func main() {
var n int = 100 // エラー
_ = 200 // OK
}
コンパイルエラーになるもの(3)
■ インタフェースの未実装
type Hex int
func (h Hex) Str() string {
return fmt.Sprintf("%x", int(h))
}
// エラー
var _ fmt.Stringer = Hex(100)
type Stringer interface {
String() string
}
コンパイルエラーになるもの(4)
■ 曖昧な記述
type Hoge struct{ N int }
type Piyo struct{ N int }
type Foo struct {
Hoge
Piyo
}
func main() {
f := Foo{Hoge{100}, Piyo{200}}
fmt.Println(f.N) // エラー
fmt.Println(f.Hoge.N) // OK
}
Goとテスト
■ 言語のコンセプトを守る
● 実現する手段は少なく
⇒ テストの為のミニ言語を入れない。
● 暗黙的で曖昧な記述をさせない
⇒ アサーションで自動でエラーメッセージを作らない。
 コンテキストにあったエラーメッセージを作る。
■ コンパイルエラーで検出できる
コンパイルで検出できるものはテストは不要。
コンパイルでは検出できないものに集中できる。
■ テストが良いサンプル
テストがGoで書かれてるので良いサンプルになる。
FAQを読もう!
テストツールを
言語標準で用意する理由は?
Goと周辺ツール
■ go tool
標準で提供されるツール群。
標準ツールなので親和性が高い。
● gofmt
コードフォーマッタ
● go test
ユニットテストツール
● godoc
ドキュメント生成ツール
● go vet
よくあるバグのパターンから警告を出すツール
ドキュメントとテスト
■ テストされたサンプル
func ExampleHex_String() {
fmt.Println(mypkg.Hex(10))
// Output: a
}
テストファイルにExampleで始まる
関数を書くとサンプルとして扱われる。
// Output:を書くとテスト対象になる。
言語標準ツールの強み
■ ツール間で連携が取りやすい
標準ツールなので,
他のツールと連携が取りやすい
■ メンテが保証される
 バグが放置されたり,
メンテされなかったりしない
■ みんなが共通に使う
その言語を使っているユーザ間で,
共通の知識になる
テストツールも
言語標準のメリットは大きい
まとめ
■ 自前のテスティングフレームワークは不要
● 言語のコンセプトを守る
● テストをGoで書くメリットが大きい
● コンパイルエラーや言語のシンプルさでテス
トを減らせる
⇒ 多少t.Errorfで書く量増えても大丈夫
■ テストツールは言語標準がよい
● ツール間で連携が取りやすい
● メンテが保証される
● みんなが共通に使う
おまけ
Go Mock
■ インタフェースのモックを作るツール
github.com/golang/mock/gomock
メソッドが呼ばれているかなどがテストできる。
標準パッケージではなく,サブプロジェクト。
func TestSample(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
m := mock.NewMockSample(ctrl)
m.EXPECT().Method("hoge").Return(1)
t.Log("result:", m.Method("hoge"))
}
参考:http://qiita.com/tenntenn/items/24fc34ec0c31f6474e6d

More Related Content

What's hot

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 

What's hot (20)

OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
Go入門
Go入門Go入門
Go入門
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCI
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
 
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
 
逆説のスタートアップ思考
逆説のスタートアップ思考逆説のスタートアップ思考
逆説のスタートアップ思考
 
Humble Object Patternな話
Humble Object Patternな話Humble Object Patternな話
Humble Object Patternな話
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinx
 
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
Laravelとテストについて
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/Prism
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 

Viewers also liked

Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
Masakazu Muraoka
 

Viewers also liked (20)

クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!
 
Go初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうGo初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろう
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
 
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
 
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版
 
awk入門
awk入門awk入門
awk入門
 
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
 
Teratail Study  ~機械学習編#1~
Teratail Study  ~機械学習編#1~Teratail Study  ~機械学習編#1~
Teratail Study  ~機械学習編#1~
 
ニュースパスのクローラーアーキテクチャとマイクロサービス
ニュースパスのクローラーアーキテクチャとマイクロサービスニュースパスのクローラーアーキテクチャとマイクロサービス
ニュースパスのクローラーアーキテクチャとマイクロサービス
 
マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
 
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
 
Goを知る
Goを知るGoを知る
Goを知る
 
Github第8章
Github第8章Github第8章
Github第8章
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
HighBatch
HighBatchHighBatch
HighBatch
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets heroku
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #gocon
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12
 

Similar to Goとテスト

今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
Atsushi Tadokoro
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
Atsuhiro Kubo
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
Takako Miyagawa
 

Similar to Goとテスト (20)

Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選
 
エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法
 
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ IIマスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
 
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGo
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化
 

More from Takuya Ueda

More from Takuya Ueda (20)

Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −
 
WebAssembly with Go
WebAssembly with GoWebAssembly with Go
WebAssembly with Go
 
GAE/Goとsyncパッケージ
GAE/GoとsyncパッケージGAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
そうだ、Goを始めよう
そうだ、Goを始めようそうだ、Goを始めよう
そうだ、Goを始めよう
 
マスター・オブ・goパッケージ
マスター・オブ・goパッケージマスター・オブ・goパッケージ
マスター・オブ・goパッケージ
 
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
 
GoによるiOSアプリの開発
GoによるiOSアプリの開発GoによるiOSアプリの開発
GoによるiOSアプリの開発
 
Static Analysis in Go
Static Analysis in GoStatic Analysis in Go
Static Analysis in Go
 
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Gopher Fest 2017参加レポート
Gopher Fest 2017参加レポートGopher Fest 2017参加レポート
Gopher Fest 2017参加レポート
 
Google Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめGoogle Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめ
 
Cloud functionsの紹介
Cloud functionsの紹介Cloud functionsの紹介
Cloud functionsの紹介
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
 
Cloud Functionsの紹介
Cloud Functionsの紹介Cloud Functionsの紹介
Cloud Functionsの紹介
 
Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践
 
Mobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse BindingMobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse Binding
 
粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法
 

Goとテスト