Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaのテストGroovyでいいのではないかという話
Search
disc99
September 11, 2016
Technology
0
280
JavaのテストGroovyでいいのではないかという話
disc99
September 11, 2016
Tweet
Share
More Decks by disc99
See All by disc99
アーキテクチャ選択の裏側
disc99
0
58
120リポジトリを1つのMonorepoに統合した理由
disc99
1
1k
モノリスとマイクロサービスを経てモジュラモノリスを導入した実践事例
disc99
25
14k
PaaS DX by Cloud Native Buildpacks
disc99
0
210
全てのAPIをProtocol Buffersで管理する / Manage all APIs with Protocol Buffers
disc99
2
5.3k
Serverless Application
disc99
1
2.8k
イベント駆動マイクロサービスアーキテクチャ / Event-Driven Microservices Architecture
disc99
4
2.8k
Event Sourcing 101
disc99
1
180
NGINX Blogから考えるマイクロサービスのProxy設計
disc99
0
910
Other Decks in Technology
See All in Technology
第64回コンピュータビジョン勉強会「The PanAf-FGBG Dataset: Understanding the Impact of Backgrounds in Wildlife Behaviour Recognition」
x_ttyszk
0
240
【あのMCPって、どんな処理してるの?】 AWS CDKでの開発で便利なAWS MCP Servers特集
yoshimi0227
6
950
サービスを止めるな! DDoS攻撃へのスマートな備えと最前線の事例
coconala_engineer
1
180
Four Keysから始める信頼性の改善 - SRE NEXT 2025
ozakikota
0
410
スタックチャン家庭用アシスタントへの道
kanekoh
0
120
ビジネス職が分析も担う事業部制組織でのデータ活用の仕組みづくり / Enabling Data Analytics in Business-Led Divisional Organizations
zaimy
1
390
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
500
AI Ready API ─ AI時代に求められるAPI設計とは?/ AI-Ready API - Designing MCP and APIs in the AI Era
yokawasa
6
1.7k
セキュアなAI活用のためのLiteLLMの可能性
tk3fftk
1
330
60以上のプロダクトを持つ組織における開発者体験向上への取り組み - チームAPIとBackstageで構築する組織の可視化基盤 - / sre next 2025 Efforts to Improve Developer Experience in an Organization with Over 60 Products
vtryo
3
1.9k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
39k
SRE with AI:実践から学ぶ、運用課題解決と未来への展望
yoshiiryo1
0
300
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
830
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Designing Experiences People Love
moore
142
24k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Being A Developer After 40
akosma
90
590k
Statistics for Hackers
jakevdp
799
220k
Building Applications with DynamoDB
mza
95
6.5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Transcript
JavaのテストGroovy でいいのではないかと いう話 @disc99
もくじ • 背景 • はじめに • テストに求められること • Java ×
JUnitのテスト • Groovy × Spockのテスト • Groovyの活用 • まとめ
背景 • Groovy、Spockについて • いきなり勧めてもメリットが分かりにくい • 導入するにあたって • 使い方やメリットを共有したい •
参考資料が欲しい
注意点 • このスライド • テスト = ユニットテスト、テストコード • プロダクションコードはJavaで開発を想 定
はじめに
テスト書いてますか?
テストがどうあるべきか分か りますか?
今回はもう一歩先の話
テストに求められること • 仕様、処理の明確化 • 複雑な仕様も簡潔な記述で理解できる • テスト側にバグが生まれるような複雑な構造にしない • 安全なコード修正、バグの検知 •
開発スピードの向上 • 開発者の安心感
多くのケース網羅が必要なテストにおいて 簡潔な記述 複雑な構造×
現実
テストに求められること (現実) • 仕様、処理の明確化 • 複雑なセットアップ、大量のモック化、読み取れない処理内容 • 安全なコード修正、バグの検知 • テスト成功させるためだけのその場限りの修正
• 開発スピードの向上 • 工数軽減のためにテスト自体を後回し • 開発者の安心感 • 不足したテスト、信頼性の低下による拭い去れない不安
現実は厳しい
テストどうする?
Java × JUnit で解決する
よくあるJUnit
よくあるJUnit テスト名が適当 繰り返されるsetupとassert - 途中で失敗すると実行されない - どこまでが初期化でどこまでが ターゲット? - 全ての組み合わせがわかりくい
JUnit4からはassetThatが追加 一つのテストで複数メソッド のテスト
JUnitで解決
JUnitで解決 適切なテスト名 @Beforeによるsetup Theoriesでパラメータ化テスト コンテキスト単位でEnclosedなども使用 テストパターンの可読性向上 assertが一つになりテスト内容が明確化
JUnit 5ではより改善? • @DisplayNameでテスト名を記述 • @Nestedのよる構造化 • ParameterResolverでパラメータ化テスト • DynamicTestによる動的テスト
• Rule、TestRunnerとかは廃止 • Matcherに非依存 • Java 8以上
解決\(^o^)/
さらにテストが増えると…
うーん…
本当に解決?
実際に開発は もっと複雑
JUnitの問題点 • 構造化すると可読性が悪化しやすい • テストの失敗が分かりにくい • 複雑になってくると記法の一貫性確保が難しい • assertやmockなどが外部ライブラリに依存 •
そもそも、Javaは基本的に冗長
Groovy × Spock で解決する
JavaなのにGroovy?
Groovyとは • ポストJava(置き換え)ではなく、Javaの拡張 • Javaとの併用のために生まれ、併用に特化された 言語 • モダンな言語の機能を積極的に取り込み • Rubyに似た文法で柔軟、拡張性が高い
• Java VMとgroovy-all.jarだけあれば動く
Hello World
Hello World 違いは拡張子のみ
Javaの記法は ほぼそのまま動く (ラムダ式はクロージャ)
Groovyでよりシンプルに Groovyで書いた同じ処理 HTTPに限れば Javaで書いた処理
JavaエンジニアにとってのGroovy • Groovyが分からなければJavaで書く • 分かればGroovyも書く • レビューなどを通してキャッチアップ • 随時理解で十分なゆるい学習曲線
他言語を導入するのとの違い 知らない ちょっと知って る すごく知ってる 他言語 × △? ◎ Groovy
◯ ◯ ◎
Spockとは? • Groovyのテスティングフレームワーク • PowerAssertによる強力なレポーティング • ブロックによる記法の統一 • DSLを使った簡潔で分かりやすい記述 •
標準でMockのAPIを提供
JUnitからSpockへ(Before)
JUnitからSpockへ(After)
JavaからGroovyへ
JavaからGroovyへ Method Unrolling Blocks Power Assert Data Tables
Blocks • ラベルによってブロック を分割 • xUnit Test Patternsの "Four Phase
Test"をフ レームワークとして強制 &宣言的に記述 • 従わない場合エラー
Power Assert • 失敗時に中間結果も含む詳 細を出力 • Groovy本体にも取り込まれ た強力なレポーティング機 能 •
多言語のライブラリにも移 植
Data Tables • パラメータ化テストの サポート • テストパターンの可読 性向上 • ‘||’でパラメータと結果
を見分けやすく
Method Unrolling 実行時テスト名を動的に変更 文字列のメソッド
Others • Exception Test • Data Pipe • Mock •
Spy • Stub • @ExtensionAnnotation • 詳しくは • http://spock-framework-reference-documentation- ja.readthedocs.io/ja/latest/index.html • http://spockframework.github.io/spock/docs/1.0/
Java×JUnit to Groovy×Spock
多くのケース網羅が必要なテストにおいて 簡潔な記述 複雑な構造× Groovy × Spockが解決
テストに便利なGroovy • Collection • Map Constructor • GString • File
• SQL • DSL
Collection • 容易な初期化 • シンプルな記法 • setupなどに便利
Map Constructor • 1ラインで初期化 • setupで便利
GString • ヒアドキュメント • 可読性向上 • whereブロック変数との 組み合わせ可能 • モックやSQL文などに便
利
File • 簡潔な記述 • 外部ライブラリならCSV やExcelも扱いやすい • テストデータ生成に便利
SQL • 面倒なセットアップ無し • 外部ライブラリ不要 • テストデータ準備、 assertなどに便利
DSL • Javaでは出来ない言語 拡張 • アイディア次第で色々 可能(やり過ぎ注意) • 可読性、効率向上 https://github.com/disc99/table-setup
その他Groovy活用 • Geb • Groovyの機能を活用したSeleniumラッパー • Selenumも推奨するPageObjectパターンを利用したメンテナンス性の高いテスト、 JQueryライクなインターフェイス、Spock連携 • Gradle
• Spring、Hibernate、Androidなどにも標準採用されているビルドツール • Mavenのようなライフサイクル管理、依存性解決、Groovyのシンプルなシンタックス、 DSLを利用した可読性、柔軟なビルドスクリプト • IntelliJ IDEA • 標準でGroovyをサポートしているIDE。プラグインなどの追加不要でGroovyを記述可能
ただGroovyってどうなの? • 最近流行りのJVM言語ではない? • モダンな動的言語、テスト用途としては十分な機能 • 破壊的変更がある他のJVM言語とは違い、ほとんどのJava構文が使え る • 将来性は?
• 少なくともこの先数年は現役で使える(個人的印象) • 廃れたとしても、削減した時間で十分もとは取れる • それでも不安なら、Groovyの独自記法は避けJavaらしい記法によせる
テストに求められること (Groovy×Spock適用後) • 仕様、処理の明確化 → 複雑なセットアップ、多数のモック化、読み取れない処理内 容 • Groovyのシンプルなシンタックスによりテスト内容に集中可能 •
安全なコード修正、バグの検知 → その場限り、テスト成功させるためだけの修正 • PowerAssertによる失敗内容の明確化 • 開発スピードの向上 → 工数軽減のために後回し • 軽量化した記述量、可読性向上によって短時間でテスト記述が可能 • 開発者の安心感 → 不足したテストによる消し去れない不安 • whereブロックによるパラメータ化テストなど多くのケースを簡単に網羅可能
まとめ • Groovyは導入の負荷にならない学習コスト、緩やか な学習曲線 • Javaの冗長なテスト記述を軽減、高速化、可読性向上 • Spockで宣言的かつシンプルに多くのパターンを網羅 • PowerAssertでテスト失敗時にも直感的なエラー表示
• その他Groovy機能、ツールを利用し開発効率化
Javaのかわりに Groovy
Javaで開発するから Groovy
JavaのテストGroovyでいい んじゃない?
参考 • http://qiita.com/euno7/items/ 1e834d3d58da3e659f92 • http://www.slideshare.net/nobeans/javagroovy • http://qiita.com/kazurof/items/ 584a3ff49e9a2f4c7717 •
http://www.slideshare.net/uehaj/groovy- bootcamp-2015-by-jggug