Submit Search
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
22 likes
10,079 views
Takuya Ueda
appengine ja night #35の発表資料です。 http://gcpja.connpass.com/event/44024/
Technology
Read more
1 of 40
Download now
Downloaded 29 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
More Related Content
PDF
GAE/GoでWebアプリ開発入門
Takuya Ueda
PDF
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Hirokazu Fukami
PDF
Goでwebアプリを開発してみよう
Takuya Ueda
PDF
GAE/GoでLINE Messaging API を使う
Takuya Ueda
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
Takuya Ueda
PDF
Goでかんたんソースコードの静的解析
Takuya Ueda
PDF
Goとテスト
Takuya Ueda
PDF
Go1.8 for Google App Engine
Takuya Ueda
GAE/GoでWebアプリ開発入門
Takuya Ueda
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Hirokazu Fukami
Goでwebアプリを開発してみよう
Takuya Ueda
GAE/GoでLINE Messaging API を使う
Takuya Ueda
エディタの壁を越えるGoの開発ツールの文化と作成法
Takuya Ueda
Goでかんたんソースコードの静的解析
Takuya Ueda
Goとテスト
Takuya Ueda
Go1.8 for Google App Engine
Takuya Ueda
What's hot
(20)
PDF
Go入門
Takuya Ueda
PDF
オススメの標準・準標準パッケージ20選
Takuya Ueda
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
PDF
Go初心者向けハンズオン コマンドラインツールを作ろう
Takuya Ueda
PDF
今日から始める Go言語 と appengine
a know
PDF
条件式評価器の実装による管理ツールの抽象化
Takuya Ueda
PDF
GAE/Goとsyncパッケージ
Takuya Ueda
PDF
実践Go ツールの作成から配布まで
Yusuke Miyake
PDF
Go mobileでモバイルアプリを作ろう
Takuya Ueda
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
PDF
Goにおける静的解析と製品開発への応用
Takuya Ueda
PDF
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
PDF
GoによるiOSアプリの開発
Takuya Ueda
PDF
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo
PDF
PyCon JP 2016 ビギナーセッション
Tetsuya Morimoto
PDF
Gopher Fest 2017参加レポート
Takuya Ueda
PDF
Go MobileでAndroidアプリ開発
Takuya Ueda
PDF
Cloud functionsの紹介
Takuya Ueda
PDF
GoでMinecraftっぽいの作る
京大 マイコンクラブ
PDF
Goだけでモバイルアプリを作ろう
Takuya Ueda
Go入門
Takuya Ueda
オススメの標準・準標準パッケージ20選
Takuya Ueda
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
Go初心者向けハンズオン コマンドラインツールを作ろう
Takuya Ueda
今日から始める Go言語 と appengine
a know
条件式評価器の実装による管理ツールの抽象化
Takuya Ueda
GAE/Goとsyncパッケージ
Takuya Ueda
実践Go ツールの作成から配布まで
Yusuke Miyake
Go mobileでモバイルアプリを作ろう
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
Goにおける静的解析と製品開発への応用
Takuya Ueda
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
GoによるiOSアプリの開発
Takuya Ueda
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo
PyCon JP 2016 ビギナーセッション
Tetsuya Morimoto
Gopher Fest 2017参加レポート
Takuya Ueda
Go MobileでAndroidアプリ開発
Takuya Ueda
Cloud functionsの紹介
Takuya Ueda
GoでMinecraftっぽいの作る
京大 マイコンクラブ
Goだけでモバイルアプリを作ろう
Takuya Ueda
Ad
Viewers also liked
(20)
PDF
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
PDF
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
PDF
ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意
Yasuyuki Kamata
PDF
テストを書こう、Unity編
Hiroto Imoto
PDF
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
PDF
神に近づくx/net/context (Finding God with x/net/context)
guregu
PPTX
MongoDBの可能性の話
Akihiro Kuwano
PDF
SLOのすすめ
Takeo Sawada
PDF
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Kentoku
PDF
An introduction and future of Ruby coverage library
mametter
PDF
AWS X-Rayによるアプリケーションの分析とデバッグ
Amazon Web Services Japan
PPTX
AndApp開発における全て #denatechcon
DeNA
PDF
Blockchain on Go
Seiji Takahashi
PDF
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Spark Summit
PDF
golang.tokyo #6 (in Japanese)
Yuichi Murata
PPTX
ScalaからGoへ
James Neve
PDF
Microservices at Mercari
Google Cloud Platform - Japan
PDF
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
PDF
Fast and Reliable Swift APIs with gRPC
Tim Burks
PPTX
Solving anything in VCL
Fastly
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意
Yasuyuki Kamata
テストを書こう、Unity編
Hiroto Imoto
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
神に近づくx/net/context (Finding God with x/net/context)
guregu
MongoDBの可能性の話
Akihiro Kuwano
SLOのすすめ
Takeo Sawada
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Kentoku
An introduction and future of Ruby coverage library
mametter
AWS X-Rayによるアプリケーションの分析とデバッグ
Amazon Web Services Japan
AndApp開発における全て #denatechcon
DeNA
Blockchain on Go
Seiji Takahashi
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Spark Summit
golang.tokyo #6 (in Japanese)
Yuichi Murata
ScalaからGoへ
James Neve
Microservices at Mercari
Google Cloud Platform - Japan
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
Fast and Reliable Swift APIs with gRPC
Tim Burks
Solving anything in VCL
Fastly
Ad
Similar to メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
(20)
PDF
JS開発におけるTDDと自動テストツール利用の勘所
Koji Nakamura
PDF
エキスパートGo
Takuya Ueda
PDF
Rocroにおけるgcp活用事例
Kishin Yagami
PDF
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
PDF
Go Friday 傑作選
Takuya Ueda
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
PDF
静的解析を使った開発ツールの開発
Takuya Ueda
PDF
Tokyor14 - R言語でユニットテスト
Yohei Sato
PDF
はこだてIKA 第4回勉強会 単体テスト
Seiji KOMATSU
PDF
第4回勉強会 単体テストのすすめ
hakoika-itwg
PDF
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
PDF
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
PPTX
Go guide for Java programmer
Masaaki Yonebayashi
PDF
Goとtest coverage
nakaji-s
PDF
JavaScript経験者のためのGo言語入門
Shohei Arai
PDF
ソフトウェアテスト入門
Preferred Networks
PDF
人生がときめくAPIテスト自動化 with Karate
Takanori Suzuki
PDF
書こう! 使おう! 単体テスト
ryohji ikebe
PDF
超簡単!!なTestLinkの使い方
Cake YOSHIDA
PDF
書こう! 使おう! 単体テスト
ryohji ikebe
JS開発におけるTDDと自動テストツール利用の勘所
Koji Nakamura
エキスパートGo
Takuya Ueda
Rocroにおけるgcp活用事例
Kishin Yagami
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
Go Friday 傑作選
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
静的解析を使った開発ツールの開発
Takuya Ueda
Tokyor14 - R言語でユニットテスト
Yohei Sato
はこだてIKA 第4回勉強会 単体テスト
Seiji KOMATSU
第4回勉強会 単体テストのすすめ
hakoika-itwg
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
Go guide for Java programmer
Masaaki Yonebayashi
Goとtest coverage
nakaji-s
JavaScript経験者のためのGo言語入門
Shohei Arai
ソフトウェアテスト入門
Preferred Networks
人生がときめくAPIテスト自動化 with Karate
Takanori Suzuki
書こう! 使おう! 単体テスト
ryohji ikebe
超簡単!!なTestLinkの使い方
Cake YOSHIDA
書こう! 使おう! 単体テスト
ryohji ikebe
More from Takuya Ueda
(11)
PDF
WebAssembly with Go
Takuya Ueda
PDF
そうだ、Goを始めよう
Takuya Ueda
PDF
マスター・オブ・goパッケージ
Takuya Ueda
PDF
メルカリ カウルのマスタデータの更新
Takuya Ueda
PDF
Static Analysis in Go
Takuya Ueda
PDF
Go静的解析ハンズオン
Takuya Ueda
PDF
Google Assistant関係のセッションまとめ
Takuya Ueda
PDF
Cloud Functionsの紹介
Takuya Ueda
PDF
Namespace API を用いたマルチテナント型 Web アプリの実践
Takuya Ueda
PDF
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
PDF
粗探しをしてGoのコントリビューターになる方法
Takuya Ueda
WebAssembly with Go
Takuya Ueda
そうだ、Goを始めよう
Takuya Ueda
マスター・オブ・goパッケージ
Takuya Ueda
メルカリ カウルのマスタデータの更新
Takuya Ueda
Static Analysis in Go
Takuya Ueda
Go静的解析ハンズオン
Takuya Ueda
Google Assistant関係のセッションまとめ
Takuya Ueda
Cloud Functionsの紹介
Takuya Ueda
Namespace API を用いたマルチテナント型 Web アプリの実践
Takuya Ueda
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
粗探しをしてGoのコントリビューターになる方法
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
1.
メルカリアッテの 実務で使えた、 GAE/Goの開発を 効率的にする方法 2016/11/08(火) @appengine ja night
#35 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.
2.
アジェンダ ● 自己紹介 ● GAE/Goのテストを効率化する ○
インスタンスを使いまわす ○ テストの並列化 ○ 差分テスト ○ ビルドタグとテスト ● GAE/Goのデバッグ ○ Goとデバッガ ○ ローカルサーバでデバッグ
3.
自己紹介 メルカリ/ソウゾウ 上田拓也 twitter: @tenntenn ■ Go歴
/ GAE歴 Go:5〜6年くらい? GAE:最近再開、GCPUG Tokyoのスタッフ ■ 業務 GAE/Goでメルカリアッテを作ってます Goのコミュニティを盛り上げる仕事 Gopherを描く仕事
4.
引用元:https://cloud.google.com/about/locations/japan/ 東京 GCP リージョン!
5.
アッテ開発の技術 : Golang
と Google App Engine
6.
テスト書いてますか?
7.
画像:http://www.slideshare.net/t_wada/jasst-2014-hokkaidotwadatdd#4
8.
Goはテスト書きやすい ■ コンパイルする強み ● 多くのバグがコンパイルで検出できる ●
型や引数のテストは必要なし ● 重要な部分のテストに集中できる ■ インタフェースを使ってテスト ● io.Writerとio.Reader ● テストしやすい設計がやりやすい ■ 標準ツールでテストができる ● フレームワークを覚える必要なし ● Goが読めればテストが読める 参考:Goとテスト
9.
じゃあ、なぜテスト書かないのか?
10.
テストを書かなくなる理由 ■ テストが重い ● aetestが重い ●
テストするパッケージが大量にある ■ やっぱりifをたくさん書くのは大変 ● フレームワーク使いたい ■ テストする時間がない ● 実装だけで精一杯
11.
aetestとは? ■ 何ができるのか? ● http.Requestが生成できる ●
context.Contextが生成できる ● テストからDatastoreなどを使える ■ どうやってるのか? ● ローカルサーバを起動 ○ dev_appserver.pyを使用 ■ ドキュメント ● Local Unit Testing for Go ● The aetest package
12.
aetestの使い方 ctx, done, err
:= aetest.NewContext() if err != nil {...} defer done() it := &memcache.Item{ Key: "some-key", Value: []byte("some-value"), } err = memcache.Set(ctx, it) if err != nil {...} it, err = memcache.Get(ctx, "some-key") if err != nil {...} if string(it.Value) != "some-value" { ... } 内部で aetest.NewInstance() が呼ばれている Memcacheへ アクセスしている
13.
aetestが遅い理由 ■ ローカルサーバの立ち上げが遅い ● NewInstanceの度に立ち上がる ●
テストの数が増えればその分増える func Test1(t *testing.T) { ctx, done, err := aetest.NewContext() ... } func Test2(t *testing.T) { ctx, done, err := aetest.NewContext() ... } この度に サーバが立ちあがる!
14.
favclip/testerator ■ テスト間でインスタンスを使いまわせる ● https://github.com/favclip/testerator testerator.SpinUp() testerator.SpinUp() testerator.SpinUp() testerator.SpinDown() testerator.SpinDown() testerator.SpinDown() 起動 影響なし Datastore,
Memcache, Search APIを初期化 終了
15.
テストの並列化 ■ テストを並列化する ● t.Parallelを呼び出す func
Test1(t *testing.T) { t.Parallel() ... } Datastoreなどへの 書き込みが競合するので注意
16.
Namespaceを使う ■ テストごとに名前空間を変える ● appengine.Namespace()を呼び出す func
Test1(t *testing.T) { t.Parallel() ... c, err = appengine.Namespace(c, "namespace1") ... } サービスでNamespaceを 使ってたら使えない手段
17.
差分テスト ■ 増えていくテスト ● プロジェクト規模と共にテストも増える ●
1/3くらいがテスト ● テスト待ちでマージできない ■ 更新してない部分はテストしたくない ● そんなに更新した箇所は多くない ● gitでバージョン管理しているのに... うまく差分だけ テストできないの?
18.
coverprofile ■ テストカバレッジの分析 $ go
test -coverprofile=profile fmt $ head profile mode: set fmt/format.go:30.13,31.29 1 1 fmt/format.go:31.29,34.3 2 1 fmt/format.go:67.28,69.2 1 1 fmt/format.go:71.33,74.2 2 1 fmt/format.go:77.85,80.11 3 1 fmt/format.go:84.2,85.11 2 1 fmt/format.go:96.2,96.8 1 1 fmt/format.go:80.11,83.3 2 0 fmt/format.go:85.11,86.21 1 1 パッケージ名 テストできるのは パッケージごと
19.
カバレッジの可視化 $ go tool
cover -html=profile 参考:https://blog.golang.org/cover
20.
coverprofileの中身 ■ テストが依存しているファイルが分かる mode: set fmt/format.go:30.13,31.29
1 1 fmt/format.go:31.29,34.3 2 1 fmt/format.go:67.28,69.2 1 1 fmt/format.go:71.33,74.2 2 1 fmt/format.go:77.85,80.11 3 1 ... fmt/scan.go:1181.46,1183.4 1 1 fmt/scan.go:1185.29,1187.9 2 1 fmt/scan.go:1195.27,1197.3 1 1 テストで通った箇所
21.
coverprofileで差分テストをする ■ coverprofileの生成 ● すべてのパッケージのcoverprofileを生成する ●
coverprofileはコミットしておく ■ テストが必要なパッケージを割り出す ● git diff --name-onlyでファイル一覧を取る ● coverprofile内にファイル名が出てるか? ● 出てたらそのパッケージはテスト対象 ■ 差分テスト ● テスト対象のパッケージのみテスト ● テストの際にcoverprofileを生成 ● coverprofileはコミットしておく 参考:http://qiita.com/tenntenn/items/caafa121b90fc7a53a8a
22.
差分テストの問題点 ■ パッケージごとにテストが走る ● パッケージが大きいと効果なし ●
testeratorの効果が減る ■ なんとなく不安 ● 漏れがないのか?
23.
goappコマンドとgoコマンド ■ GAE/Goではgoappコマンドを使う ● goコマンドと何が違うのか? ●
ソースコードレベルで比べてみた if buildContext.InstallSuffix != "" { buildContext.InstallSuffix += "_" } buildContext.InstallSuffix += "appengine" buildContext.BuildTags = append(buildContext.BuildTags, "appengine") InstallSuffixと BuildTagsくらいの差分
24.
appengieタグ ■ goappを使うとappengineタグが付く ● Standard
Environment 向けにはappengineタグ ● Flexible Environment 向けにはappengineタグなし ■ goコマンドでも同じか? ● -tags "appengine"でタグが付けれる ● GOPTHとGOROOTが違うの注意 ● GOROOTにappengineパッケージがある ○ google.golang.org/appengineではない
25.
ビルドタグを活用する ■ GAEに依存する部分のテスト ■ GAEに依存しない部分のテスト //+build
appengine package mypkg_test ... //+build !appengine package mypkg_test ...
26.
ビルドタグを活用する ■ GAEに依存する部分のテストの実行 ■ GAEに依存しない部分のテストの実行 $
goapp test mypkg $ go test mypkg 重めなGAEに依存するテストと そうでない物は分ける!
27.
差分テストとビルドタグ ■ GAEに依存する部分のテストの実行 ■ GAEに依存しない部分のテストの実行 $
goapp test -coverprofile=profile_gae mypkg coverprofileをコミットしておけば 更新頻度の低いパッケージのテストは走らない $ go test -coverprofile=profile mypkg
28.
デバッグはどうしてますか?
29.
_人人人人人人人人_ > printデバッグ <  ̄Y^Y^Y^Y^Y^Y^Y ̄
30.
_人人人人人人人人人人人人_ > panic("oh my god") <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
31.
Goで使えるデバッガ ■ GDB ● https://golang.org/doc/gdb ●
おなじみのデバッガ ■ godebug ● https://github.com/mailgun/godebug ● コード生成する面白いデバッガ ■ delve ● https://github.com/derekparker/delve ● Go専用デバッガ ● IDEの対応状況がよい
32.
GAEのローカルサーバでのデバッグ ■ GAE/Goのプロセスにattachする必要 ● 複数のプロセスが起動する場合がある ○
--max_module_instances=1で起動 ● プロセスが変わる ○ delveAppengineを使う ○ http://qiita.com/tenntenn/items/0b28f65de054df0 58a0e
33.
GAEのローカルサーバでのデバッグ
34.
delveのIDE・エディタの対応状況 参考 :https://github.com/derekparker/delve/blob/master/Document ation/EditorIntegration.md IntelliJ IDEAは GAEに対応したプラグインがある
35.
Vimではできないの!?
36.
vim-goで対応されないっぽい 参考:https://github.com/fatih/vim-go/issues/233
37.
nvim-goではdelveは対応済 参考:https://asciinema.org/a/92011
38.
delveのconnectも対応して貰えそう 参考:https://twitter.com/_zchee_/status/794928877403455488 ※attachではなくconnectでした
39.
まとめ ■ テスト ● 重いテストは工夫しだいで軽くできる ○
インスタンスの使い回し ○ テストの並列化 ○ 差分テスト ○ ビルドタグ ● 必要なテストは書きましょう ■ デバッグ ● delveでデバッグしよう ● Vimmerはnvim-goの対応を待ちましょう
40.
Thank you! twitter: @tenntenn Qiita:
tenntenn connpass: tenntenn
Download