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
260
JavaのテストGroovyでいいのではないかという話
disc99
September 11, 2016
Tweet
Share
More Decks by disc99
See All by disc99
アーキテクチャ選択の裏側
disc99
0
19
120リポジトリを1つのMonorepoに統合した理由
disc99
1
890
モノリスとマイクロサービスを経てモジュラモノリスを導入した実践事例
disc99
25
14k
PaaS DX by Cloud Native Buildpacks
disc99
0
190
全てのAPIをProtocol Buffersで管理する / Manage all APIs with Protocol Buffers
disc99
2
5k
Serverless Application
disc99
1
2.6k
イベント駆動マイクロサービスアーキテクチャ / Event-Driven Microservices Architecture
disc99
4
2.5k
Event Sourcing 101
disc99
1
160
NGINX Blogから考えるマイクロサービスのProxy設計
disc99
0
840
Other Decks in Technology
See All in Technology
あなたの人生も変わるかも?AWS認定2つで始まったウソみたいな話
iwamot
3
850
AWS re:Invent 2024 recap in 20min / JAWSUG 千葉 2025.1.14
shimy
1
100
生成AIのビジネス活用
seosoft
0
110
Alignment and Autonomy in Cybozu - 300人の開発組織でアラインメントと自律性を両立させるアジャイルな組織運営 / RSGT2025
ama_ch
1
2.4k
AWSサービスアップデート 2024/12 Part3
nrinetcom
PRO
0
140
2025年のARグラスの潮流
kotauchisunsun
0
790
デジタルアイデンティティ人材育成推進ワーキンググループ 翻訳サブワーキンググループ 活動報告 / 20250114-OIDF-J-EduWG-TranslationSWG
oidfj
0
540
.NET 最新アップデート ~ AI とクラウド時代のアプリモダナイゼーション
chack411
0
200
Accessibility Inspectorを活用した アプリのアクセシビリティ向上方法
hinakko
0
180
30分でわかる「リスクから学ぶKubernetesコンテナセキュリティ」/30min-k8s-container-sec
mochizuki875
3
450
【Oracle Cloud ウェビナー】2025年のセキュリティ脅威を読み解く:リスクに備えるためのレジリエンスとデータ保護
oracle4engineer
PRO
1
100
今から、 今だからこそ始める Terraform で Azure 管理 / Managing Azure with Terraform: The Perfect Time to Start
nnstt1
0
240
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1030
460k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Building Adaptive Systems
keathley
38
2.4k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
Being A Developer After 40
akosma
89
590k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
Producing Creativity
orderedlist
PRO
343
39k
Statistics for Hackers
jakevdp
797
220k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
A Tale of Four Properties
chriscoyier
157
23k
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