Spock's world

4,558 views

Published on

JJUG CCC 2012 Fall でのスライドです。

Published in: Technology

Spock's world

  1. 1. Spock’s WorldJJUG CCC 2012 Fall R3-1株式会社デライトテクノロジーズ 綿引琢磨
  2. 2. 本スライドの対象普段 Eclipse を使っている Java デベロッパー全般JUnit を使っているが、もうちょっとスマートにテストを書きたいと思っている人テストのないプロジェクトで困っているマネージャー・リーダー
  3. 3. 自己紹介綿引琢磨(わたびきたくま)twitter : bikisuke株式会社デライトテクノロジーズ 代表取締役日本 Grails / Groovy ユーザーグループ運営委員Java / Groovy エンジニア
  4. 4. アジェンダJUnit から Spock へSpock の基礎Spock についてのよくある誤解Spock の機能拡張
  5. 5. JUnit から Spock へ
  6. 6. JUnit を積極的に使いたい理由テストの自動化ができるEclipse に標準装備プロダクトコードと同じ Java で書ける書籍や Web など情報が豊富etc.
  7. 7. JUnit の物足りないところモックの仕組みがない(モックフレームワークが別途必要)パラメタライズドテストが残念 パラメータの配列を・・・ どのパラメータがエラーかわからない (ひと工夫いる)
  8. 8. そこで Spock ですよclass HelloSpock extends spock.lang.Specification { def "length of Spocks and his friends names"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 }}
  9. 9. Spock とはGroovy 上に構築されたテストフレームワーク Groovy の機能を活用し、DSL によるシンプルで 可読性の高いテストコードを実現強力な Assert 機能でエラー箇所の特定が容易JUnit 互換のため IDE からも実行可能開発者向けの仕様テストとして、BDD も実践可能
  10. 10. JUnit との比較 JUnit Spock 記述言語 Java Groovyテストの自動化 ◎ ◎Eclipse 標準装備 ◎ △ 技術情報 ◎ △モックの仕組み △ ◎パラメタライズド △ ◎ 仕様テスト × ◎
  11. 11. Spock の基礎
  12. 12. Eclipse での環境整備Eclipse-Groovy プラグインのインストール http://groovy.codehaus.org/Eclipse+PluginEclipse の設定 「use monospace font for junit」 にチェックGroovy プロジェクトへの変換 [Configure] > [Convert to Groovy Project]ライブラリの追加
  13. 13. テストクラスの構造 org.junit.runner.Runner @RunWith(Sputnik.class) を継承 Specification HelloSpec フィクスチャメソッド() フィーチャメソッド() ヘルパーメソッド()
  14. 14. 処理の流れテスト 字句解析 コード バイト テスト AST変換コード 構文解析 生成 コード 実行
  15. 15. 処理の流れ • DSL の解析 • モック/例外実装の追加 • メタ情報の追加 • モデルの構築テスト 字句解析 コード バイト テスト AST変換コード 構文解析 生成 コード 実行
  16. 16. フィクスチャメソッドsetup() 各フィーチャメソッドの実行前に呼ばれる。cleanup() 各フィーチャメソッドの実行後に呼ばれる。setupSpec() 最初のフィーチャメソッドの実行前に呼ばれる。cleanupSpec() 最後のフィーチャメソッドの実行後に呼ばれる。
  17. 17. フィーチャメソッドテストメソッドを指すJUnit の場合、@Test を付けるメソッドに当るメソッド名は文字列で表現するのが習慣最低1つのブロックを含んでいる必要がある
  18. 18. ブロックブロック名 フェーズ 概要 フィーチャの設定作業(前提条件)を記述すsetup / given Setup る。先頭に記述する必要がある。 テスト対象の振る舞いを記述する。then when Stimulus ブロックとセットで使用する必要がある。 when ブロックに対する条件、例外条件、 then Response インタラクションを記述する。 Stimulus / 条件を記述する。then ブロックよりも記述 expect Response 制限がある。 フィーチャ内でのリソースの解放作業を記述 cleanup Cleanup する。 データドリブンテストの場合に記述する。 where - フィーチャの最後に記述する必要がある。
  19. 19. データドリブンテストSpock を使用するメリットの一つ パラメタライズドテストをスマートに記述 データはテーブル書式またはコレクションで表現 Assert 機能により、エラー箇所が明確にわかる
  20. 20. 例外に関するテスト以下の4メソッドで検証可能<T extends Throwable> T thrown()<T extends Throwable> T thrown(Class<T> type)void notThrown (<T extends Throwable> type)void noExceptionThrown()
  21. 21. テストダブル (Mock/Stub/Spy)インタラクションの代役を生成 Java / Groovy オブジェクト用の API 任意の代役を表現するワイルドカードも使えるStub の振る舞い http://yamkazu.hatenablog.com/entry/2012/10/20/222558 テストダブルの詳細 http://xunitpatterns.com/Test%20Double%20Patterns.html
  22. 22. Spock についてのよくある誤解
  23. 23. テストを Spock (Groovy) で書くと、リファクタリングできないんじゃないの?
  24. 24. 普通にできます。
  25. 25. Groovy の PowerAssert でいいんじゃないの?
  26. 26. PowerAssert と同じではありません。
  27. 27. JUnit の Rule アノテーションを活用してるから、Spockに移行できません。
  28. 28. Rule アノテーションもそのまま使えます。
  29. 29. Spock の機能拡張
  30. 30. 2つの拡張方法グローバル拡張実行コンテキストの構築時に対象のテストに対して適用されるアノテーションドリブン拡張クラスやメソッド、フィールド単位でテスト実行時に適用される
  31. 31. 拡張処理の流れテスト 字句解析 コード バイト テスト AST変換コード 構文解析 生成 コード 実行
  32. 32. 拡張処理の流れ •実行コンテキストの構築 •グローバル拡張の適用テスト 字句解析 コード バイト テスト AST変換コード 構文解析 生成 コード 実行
  33. 33. 拡張処理の流れ • アノテーション ドリブン拡張の適用 •実行コンテキストの構築 •グローバル拡張の適用テスト 字句解析 コード バイト テスト AST変換コード 構文解析 生成 コード 実行
  34. 34. グローバル拡張JUnit アダプタ JUnitFixtureMethodsExtensionJUnit Rules 適用 RuleExtension / ClassRuleExtensionテスト実行可否 IncludeExculdeExtensionテスト最適化 OptimizeRunOrderExtension
  35. 35. アノテーションドリブン拡張@AutoCleanup@FailsWith@Ignore / @IgnoreIf / @IgnoreRest@Stepwise@Timeout@Unroll@Use
  36. 36. Spock 関連情報ソースリポジトリ https://github.com/spockframework/spockドキュメント http://docs.spockframework.org/en/latest/Wiki (上記ドキュメントに移行予定) http://code.google.com/p/spock/w/list
  37. 37. 日本での情報G* ワークショップ 隔月程度のペースで都内を中心に開催G* Magazine 年に数回発刊している日本語で読める唯一の Groovy 関連電子雑誌 PDF : http://grails.jp/g_mag_jp/index.html EPUB : http://beta.mybetabook.com/u/jggug/
  38. 38. ご清聴ありがとうございました
  39. 39. Spock’s WorldJJUG CCC 2012 Fall R3-1株式会社デライトテクノロジーズ 綿引琢磨

×