狠狠撸

狠狠撸Share a Scribd company logo
JavaのテストGroovy
でいいのではないかと
いう話
@disc99
もくじ
? 背景
? はじめに
? テストに求められること
? Java × JUnitのテスト
? Groovy × Spockのテスト
? Groovyの活用
? まとめ
背景
? Groovy、Spockについて
? いきなり勧めてもメリットが分かりにくい
? 導入するにあたって
? 使い方やメリットを共有したい
? 参考資料が欲しい
注意点
? このスライド
? テスト = ユニットテスト、テストコード
? プロダクションコードはJavaで開発を想
定
はじめに
テスト书いてますか?
テストがどうあるべきか分か
りますか?
今回はもう一歩先の话
テストに求められること
? 仕様、処理の明確化
? 複雑な仕様も簡潔な記述で理解できる
? テスト側にバグが生まれるような複雑な構造にしない
? 安全なコード修正、バグの検知
? 開発スピードの向上
? 開発者の安心感
多くのケース網羅が必要なテストにおいて
簡潔な記述    複雑な構造×
现実
テストに求められること
(现実)
? 仕様、処理の明確化
? 複雑なセットアップ、大量のモック化、読み取れない処理内容
? 安全なコード修正、バグの検知
? テスト成功させるためだけのその場限りの修正
? 開発スピードの向上
? 工数軽減のためにテスト自体を後回し
? 開発者の安心感
? 不足したテスト、信頼性の低下による拭い去れない不安
现実は厳しい
テストどうする?
Java × JUnit
で解決する
よくある闯鲍苍颈迟
よくある闯鲍苍颈迟 テスト名が適当
繰り返されるsetupとassert
- 途中で失敗すると実行されない
- どこまでが初期化でどこまでが
ターゲット?
- 全ての組み合わせがわかりくい
JUnit4からはassetThatが追加
一つのテストで複数メソッド
のテスト
闯鲍苍颈迟で解决
闯鲍苍颈迟で解决
適切なテスト名
@Beforeによるsetup
Theoriesでパラメータ化テスト
コンテキスト単位でEnclosedなども使用
テストパターンの可読性向上
assertが一つになりテスト内容が明確化
JUnit 5ではより改善?
? @DisplayNameでテスト名を記述
? @Nestedのよる構造化
? ParameterResolverでパラメータ化テスト
? DynamicTestによる動的テスト
? Rule、TestRunnerとかは廃止
? Matcherに非依存
? Java 8以上
解决\(镑辞镑)/
さらにテストが増えると…
うーん…
本当に解决?
実際に開発は
もっと複雑
JUnitの問題点
? 構造化すると可読性が悪化しやすい
? テストの失敗が分かりにくい
? 複雑になってくると記法の一貫性確保が難しい
? assertやmockなどが外部ライブラリに依存
? そもそも、Javaは基本的に冗長
Groovy × Spock
で解決する
闯补惫补なのに骋谤辞辞惫测?
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を提供
闯鲍苍颈迟から厂辫辞肠办へ(叠别蹿辞谤别)
闯鲍苍颈迟から厂辫辞肠办へ(础蹿迟别谤)
闯补惫补から骋谤辞辞惫测へ
闯补惫补から骋谤辞辞惫测へ
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 × 厂辫辞肠办が解决
テストに便利なGroovy
? Collection
? Map Constructor
? GString
? File
? SQL
? DSL
Collection
? 容易な初期化
? シンプルな記法
? 蝉别迟耻辫などに便利
Map Constructor
? 1ラインで初期化
? 蝉别迟耻辫で便利
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

More Related Content

闯补惫补のテスト骋谤辞辞惫测て?いいのて?はないかという话