SlideShare une entreprise Scribd logo
1  sur  21
Groovy/Geb入門

        2011/10/31 @TDC勉強会(番外編)
JJUG幹事/ JGGUGサポートスタッフ 須江 信洋

               http://twitter.com/nobusue
            http://d.hatena.ne.jp/nobusue

        ※資料の内容は個人としての意見・見解を述べたものであり、
        所属する企業・組織が内容を保証するものではありません。
自己紹介
       須江 信洋(すえ のぶひろ)
           Twitter: @nobusue
           http://www.facebook.com/profile.php?id=732337788
       かれこれ10年位、JavaEE関連の仕事をしてます
       G*(Groovy関連技術)との関わり
           Groovyコミュニティ(JGGUG)サポートスタッフ
           「プログラミングGROOVY」執筆チーム
           「Groovy イン・アクション」翻訳チーム
           Groovyで作ったBot飼ってます(@hatena_groovy)



    2
Groovyとは
JVM上で稼動するスクリプト言語
Javaを拡張し、改良
  既存のJavaコード≒Groovyのコード
  記述量削減、「本質的なこと」に集中できる
    例) LL的なリスト/マップリテラル
    例) 過剰な例外処理の撲滅、リソース開放の自動化

Javaとの親和性が高い
  Javaのクラス=Groovyのクラス
  Javaのオブジェクト=Groovyのオブジェクト

 詳しく知りたい方はこちらへ↓
  http://d.hatena.ne.jp/uehaj/20110126/1296003293

                                       3
スクリプトの配布を楽にする:Grape
   Grape(@Grab)で、mavenリポジトリからjarを自動取
    得
       Groovy-1.6からの新機能(1.7でさらに改善)
       内部ではApache Ivyを利用
       @Grab(
          group = 'org.twitter4j', module='twitter4j-core',
          version='[2.1,)')
       import twitter4j.*
       Twitter twitter =
          TwitterFactory.getInstance("<scrname>","<pass>")
       twitter.updateStatus(args[0])
                Twitter4jを使ったTwitterクライア
                ント
                このファイルだけで動きます!!
    4
                (要Groovy-1.7以上)
Groovyは単なる言語ではない!
                Groovyのエコシステム
    Javaをカイゼン                 高生産性FW

      GSQL         Grails      Gaelyk   Griffon
SwingBuilder
                                         組み込み
MarkupBuilder                            Jenkins
 (XML/HTML)                             (Hudson)

        ビルドとテスト
                             先進的         Maven3
                             GPars
     Gant       Spock       (JSR166y)   FreeMind

    Gradle       Geb        Groovy++    JavaFX2.0
5
テスト自動化できてますか?
       Vモデル

                                                           ここは未だに
                                                           人海戦術が
                                                           主流



                                                     ここはJUnitなどで
                                                     わりかし自動化
                                                     できている




        http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB
    6
Continuous Delivery
       UATまで自動化することで道が拓ける




                      http://www.amazon.co.jp/dp/0321601912


    7
Seleniumの系譜
            2004~
        Selenium1
      (Selenium RC)                         Selenium2


            Selenium IDE
                                                                                 2009~

                                                                        Selenium2
            Selenium-Grid                                               +WebDriver

                                2006~
                                                                           2011/07
                             WebDriver
                             (Google)
                                                                           Selenium2.0リリース

    http://seleniumhq.org/docs/01_introducing_selenium.html#brief-history-of-the-selenium-project

8
Selenium1とWebDriver
       Selenium1の課題
           テスト・ドライバーがブラウザ上で稼働するため、ブラ
            ウザのサンドボックスの制限を受ける
           原理的に対応が難しい機能がある
               ファイルアップロードなど
               Ajax対応
       WebDriver
           テスト・ドライバーがブラウザ外部で稼働するため上記
            の制限を受けない
           Headless Driver(HtmlUnit)に対応
           詳細な比較については以下
            http://www.asukaze.net/etc/webdriver/

    9
Geb(じぇぶ)とは

                               http://www.gebish.org/

    Groovyで構築されたWebDriverのラッパー
        jQueryライクなNavigator APIを提供
        Page Objectパターンによる構造化
        2011/10時点での最新バージョンは0.6
    多様なテストフレームワークと統合可能
        Spock,EasyB
        JUnit3/4,TestNG
        Cucumber(Cuke4Duke)


    10
jQuery-like Navigator API
// CSS 3 selectors
$("div.some-class p:first[title='something']")

// Find via index and/or attribute matching
$("h1", 2, class: "heading")
$("p", name: "description")
$("ul.things li", 2)

// 'text' is special attribute for the element text content
$("h1", text: "All about Geb")

// Use builtin matchers and regular expressions
$("p", text: contains("Geb"))
$("input", value: ~/d{3,}-d{3,}-d{3,}/)

// Chaining
$("div").find(".b")
$("div").filter(".c").parents()
$("p.c").siblings()

  11
Page Objectパターン
class LoginPage extends Page {                       ログイン画面
   static url = "http://myapp.com/login"
   static at = { heading.text() == "Please Login" }
   static content = {
      heading { $("h1") }
      loginForm { $("form.login") }
      loginButton(to: AdminPage) { loginForm.login() }
   }
}                                                         Browser.drive {          テスト
                                                            to LoginPage
                                                            assert at(LoginPage)
                                                            loginForm.with {
                                                               username = "admin"
class AdminPage extends Page {                                 password = "password"
   static at = { heading.text() == "Admin Section" }        }
   static content = {                                       loginButton.click()
      heading { $("h1") }                                   assert at(AdminPage)
   }                                                      }
}                                                    管理画面

     12
Gebの例: はてなキーワード検索
@Grapes([
   @Grab("org.codehaus.geb:geb-core:latest.release"),
   @Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release")
])
import geb.Browser

Browser.drive {
  go "http://d.hatena.ne.jp/keyword/"
  assert title == "はてなキーワード - 話題の言葉がわかる、みんなで編集す
るキーワード"

    $("form.header-search").word = "Groovy"
    $("form.header-search").find("input", name:"submit").click()

    assert title == "はてな検索: Groovy"
}

    13
Spock(すぽっく)とは
                    http://code.google.com/p/spock/


    Groovyで構築されたBDDフレームワーク
        Groovyの動的型を活用したDSLを提供
        Power Assertで問題箇所を容易に特定可能
        可読性の高いテストケース
        データ・ドリブン・テストにより多数のテストパターン
         をコンパクトに記述可能
        テストケースはJUnitから実行可能




    14
Power Assert
def a = 1
def b = 2
def c = 3

assert (a+b)*c == 5




       途中結果や、どこでfailしたかまで教えてく
       れる。
       assertEquals()とかを組み合わせる必要ナシ。


  15
可読性の高いテストケース
def "subscribers receive published events at least once"() {
  when: publisher.send(event)
  then: (1.._) * subscriber.receive(event)
  where: event << ["started", "paused", "stopped"]
}

def "length of Spock's and his friends' names"() {
   expect:
     name.size() == length

         where:
          name | length
          "Spock" | 5
          "Kirk" | 4
          "Scotty" | 6
}
    16
GebとSpockのインテグレーション
    Gebと連携するSpockのテストケースとして以下が
     提供される
        geb.spock.GebSpec / GebReportingSpec
    browserインスタンスの注入
        WebDriverのBrowserクラスの初期化が不要
    エビデンス取得の自動化
        GebReportingSpecを利用すると、テストケースのメソッ
         ド終了時にスクリーンショット(PNG)が自動取得される




    17
GebReportingSpecの例
@Grab("org.codehaus.geb:geb-spock:0.6.0")
@Grab("org.spockframework:spock-core:0.5-groovy-1.8")
@GrabExclude("org.codehaus.groovy:groovy-all")
@Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release")
import geb.spock.GebReportingSpec

class FunctionalReportingSpec extends GebReportingSpec {
 def "Hatena Keyword Search Top"() {
   when:
     go "http://d.hatena.ne.jp/keyword/"
   then:
     title == "はてなキーワード - 話題の言葉がわかる、みんなで編集するキーワード"
   }

    def "Hatena Keyword Search Result"() {
      when:
       $("form.header-search").word = "Groovy"
       $("form.header-search").find("input", name:"submit").click()
      then:
       assert title == "はてな検索: Groovy"
    }
}

    18
GebSpec利用時の注意点
    Spock-0.5(2011/10時点)ではGroovyの@Grabを利用
     する場合は、依存関係の兼ね合いで以下が必要
        @GrabExclude("org.codehaus.groovy:groovy-all")
    GebReportingSpecを利用する場合はレポート出力先
     のディレクトリを指定しておく必要がある
        最も簡単なのはシステムプロパティを使うこと
        groovy -Dgeb.build.reportsDir=/tempdir
         GebSpockReporting.groovy




    19
JGGUGからのお知らせ
    G*ワークショップ
        だいたい月1回のペースでG*関連の勉強会を実施してい
         ます
        次回は11/22予定、Gebの詳しい話を予定
        詳細は http://www.jggug.org/ で
    G*Magazine
        http://grails.jp/g_mag_jp/
        JGGUGが発行している電子雑誌です。
        創刊号と第3号に、@bikisukeさんがGeb/Spockの技術情
         報を執筆されています。



    20
ご静聴ありがとうございました




21

Contenu connexe

Tendances

Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説Cherry Pie Web
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょKohki Nakashima
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIjunichi anno
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugYuji Kubota
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugYuji Kubota
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memoKiyotaka Oku
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Nakazawa Yuichi
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfkToshiaki Maki
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリYukiya Nakagawa
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
第2回勉強会
第2回勉強会第2回勉強会
第2回勉強会Mugen Fujii
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみようOda Shinsuke
 

Tendances (19)

Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMI
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjug
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjug
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memo
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfk
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-Javaライブラリ
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
第2回勉強会
第2回勉強会第2回勉強会
第2回勉強会
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 

En vedette

Java management extensions (jmx)
Java management extensions (jmx)Java management extensions (jmx)
Java management extensions (jmx)Tarun Telang
 
Why R? A Brief Introduction to the Open Source Statistics Platform
Why R? A Brief Introduction to the Open Source Statistics PlatformWhy R? A Brief Introduction to the Open Source Statistics Platform
Why R? A Brief Introduction to the Open Source Statistics PlatformSyracuse University
 
Introduction to R Programming
Introduction to R ProgrammingIntroduction to R Programming
Introduction to R Programmingizahn
 
R programming Basic & Advanced
R programming Basic & AdvancedR programming Basic & Advanced
R programming Basic & AdvancedSohom Ghosh
 
R language tutorial
R language tutorialR language tutorial
R language tutorialDavid Chiu
 
An Interactive Introduction To R (Programming Language For Statistics)
An Interactive Introduction To R (Programming Language For Statistics)An Interactive Introduction To R (Programming Language For Statistics)
An Interactive Introduction To R (Programming Language For Statistics)Dataspora
 

En vedette (10)

Java management extensions (jmx)
Java management extensions (jmx)Java management extensions (jmx)
Java management extensions (jmx)
 
Why R? A Brief Introduction to the Open Source Statistics Platform
Why R? A Brief Introduction to the Open Source Statistics PlatformWhy R? A Brief Introduction to the Open Source Statistics Platform
Why R? A Brief Introduction to the Open Source Statistics Platform
 
R learning by examples
R learning by examplesR learning by examples
R learning by examples
 
Introduction to R Programming
Introduction to R ProgrammingIntroduction to R Programming
Introduction to R Programming
 
R programming Basic & Advanced
R programming Basic & AdvancedR programming Basic & Advanced
R programming Basic & Advanced
 
R language tutorial
R language tutorialR language tutorial
R language tutorial
 
Class ppt intro to r
Class ppt intro to rClass ppt intro to r
Class ppt intro to r
 
R programming
R programmingR programming
R programming
 
An Interactive Introduction To R (Programming Language For Statistics)
An Interactive Introduction To R (Programming Language For Statistics)An Interactive Introduction To R (Programming Language For Statistics)
An Interactive Introduction To R (Programming Language For Statistics)
 
paytm
 paytm paytm
paytm
 

Similaire à TDC20111031_Groovy_Geb

G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
GradleどうでしょうTakuma Watabiki
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップYasuhito Yabe
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)Toshimichi Suekane
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basicTakuma Watabiki
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門Hiroki Toyokawa
 
今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おうHayashi Yuichi
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷JavaToshiaki Maki
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockJJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockNobuhiro Sue
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309Nobuhiro Sue
 

Similaire à TDC20111031_Groovy_Geb (20)

G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
Gradleどうでしょう
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門
 
今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Java 7
Java 7Java 7
Java 7
 
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockJJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 

Plus de Nobuhiro Sue

Fuse Online Hands-on Guide
Fuse Online Hands-on GuideFuse Online Hands-on Guide
Fuse Online Hands-on GuideNobuhiro Sue
 
Fuse Online Hands-on Guide
Fuse Online Hands-on GuideFuse Online Hands-on Guide
Fuse Online Hands-on GuideNobuhiro Sue
 
Knative CloudEvents
Knative CloudEventsKnative CloudEvents
Knative CloudEventsNobuhiro Sue
 
JTF2018_B30_k8s_operator_nobusue
JTF2018_B30_k8s_operator_nobusueJTF2018_B30_k8s_operator_nobusue
JTF2018_B30_k8s_operator_nobusueNobuhiro Sue
 
DevLove k8s nobusue 20180711
DevLove k8s nobusue 20180711DevLove k8s nobusue 20180711
DevLove k8s nobusue 20180711Nobuhiro Sue
 
JSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpJSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpNobuhiro Sue
 
Light and shadow of microservices
Light and shadow of microservicesLight and shadow of microservices
Light and shadow of microservicesNobuhiro Sue
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_introNobuhiro Sue
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_introNobuhiro Sue
 
Gws 20140418 camel_groovy
Gws 20140418 camel_groovyGws 20140418 camel_groovy
Gws 20140418 camel_groovyNobuhiro Sue
 
20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_GroovyNobuhiro Sue
 
Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)Nobuhiro Sue
 
クラウド研究会 20120712 BaaS
クラウド研究会 20120712 BaaSクラウド研究会 20120712 BaaS
クラウド研究会 20120712 BaaSNobuhiro Sue
 
Letsgo developer 2012 Continuous Delivery
Letsgo developer 2012 Continuous DeliveryLetsgo developer 2012 Continuous Delivery
Letsgo developer 2012 Continuous DeliveryNobuhiro Sue
 
Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradleNobuhiro Sue
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427Nobuhiro Sue
 
Html5勉強会 20120423
Html5勉強会 20120423Html5勉強会 20120423
Html5勉強会 20120423Nobuhiro Sue
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222Nobuhiro Sue
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDCNobuhiro Sue
 

Plus de Nobuhiro Sue (20)

Fuse Online Hands-on Guide
Fuse Online Hands-on GuideFuse Online Hands-on Guide
Fuse Online Hands-on Guide
 
Fuse Online Hands-on Guide
Fuse Online Hands-on GuideFuse Online Hands-on Guide
Fuse Online Hands-on Guide
 
Knative CloudEvents
Knative CloudEventsKnative CloudEvents
Knative CloudEvents
 
JTF2018_B30_k8s_operator_nobusue
JTF2018_B30_k8s_operator_nobusueJTF2018_B30_k8s_operator_nobusue
JTF2018_B30_k8s_operator_nobusue
 
DevLove k8s nobusue 20180711
DevLove k8s nobusue 20180711DevLove k8s nobusue 20180711
DevLove k8s nobusue 20180711
 
JSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpJSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocp
 
Light and shadow of microservices
Light and shadow of microservicesLight and shadow of microservices
Light and shadow of microservices
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_intro
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_intro
 
Gws 20140418 camel_groovy
Gws 20140418 camel_groovyGws 20140418 camel_groovy
Gws 20140418 camel_groovy
 
20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy
 
Gws 20140117 lt
Gws 20140117 ltGws 20140117 lt
Gws 20140117 lt
 
Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)
 
クラウド研究会 20120712 BaaS
クラウド研究会 20120712 BaaSクラウド研究会 20120712 BaaS
クラウド研究会 20120712 BaaS
 
Letsgo developer 2012 Continuous Delivery
Letsgo developer 2012 Continuous DeliveryLetsgo developer 2012 Continuous Delivery
Letsgo developer 2012 Continuous Delivery
 
Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradle
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427
 
Html5勉強会 20120423
Html5勉強会 20120423Html5勉強会 20120423
Html5勉強会 20120423
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
 

Dernier

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Dernier (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

TDC20111031_Groovy_Geb

  • 1. Groovy/Geb入門 2011/10/31 @TDC勉強会(番外編) JJUG幹事/ JGGUGサポートスタッフ 須江 信洋 http://twitter.com/nobusue http://d.hatena.ne.jp/nobusue ※資料の内容は個人としての意見・見解を述べたものであり、 所属する企業・組織が内容を保証するものではありません。
  • 2. 自己紹介  須江 信洋(すえ のぶひろ)  Twitter: @nobusue  http://www.facebook.com/profile.php?id=732337788  かれこれ10年位、JavaEE関連の仕事をしてます  G*(Groovy関連技術)との関わり  Groovyコミュニティ(JGGUG)サポートスタッフ  「プログラミングGROOVY」執筆チーム  「Groovy イン・アクション」翻訳チーム  Groovyで作ったBot飼ってます(@hatena_groovy) 2
  • 3. Groovyとは JVM上で稼動するスクリプト言語 Javaを拡張し、改良  既存のJavaコード≒Groovyのコード  記述量削減、「本質的なこと」に集中できる  例) LL的なリスト/マップリテラル  例) 過剰な例外処理の撲滅、リソース開放の自動化 Javaとの親和性が高い  Javaのクラス=Groovyのクラス  Javaのオブジェクト=Groovyのオブジェクト  詳しく知りたい方はこちらへ↓  http://d.hatena.ne.jp/uehaj/20110126/1296003293 3
  • 4. スクリプトの配布を楽にする:Grape  Grape(@Grab)で、mavenリポジトリからjarを自動取 得  Groovy-1.6からの新機能(1.7でさらに改善)  内部ではApache Ivyを利用 @Grab( group = 'org.twitter4j', module='twitter4j-core', version='[2.1,)') import twitter4j.* Twitter twitter = TwitterFactory.getInstance("<scrname>","<pass>") twitter.updateStatus(args[0]) Twitter4jを使ったTwitterクライア ント このファイルだけで動きます!! 4 (要Groovy-1.7以上)
  • 5. Groovyは単なる言語ではない! Groovyのエコシステム Javaをカイゼン 高生産性FW GSQL Grails Gaelyk Griffon SwingBuilder 組み込み MarkupBuilder Jenkins (XML/HTML) (Hudson) ビルドとテスト 先進的 Maven3 GPars Gant Spock (JSR166y) FreeMind Gradle Geb Groovy++ JavaFX2.0 5
  • 6. テスト自動化できてますか?  Vモデル ここは未だに 人海戦術が 主流 ここはJUnitなどで わりかし自動化 できている http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB 6
  • 7. Continuous Delivery  UATまで自動化することで道が拓ける http://www.amazon.co.jp/dp/0321601912 7
  • 8. Seleniumの系譜 2004~ Selenium1 (Selenium RC) Selenium2 Selenium IDE 2009~ Selenium2 Selenium-Grid +WebDriver 2006~ 2011/07 WebDriver (Google) Selenium2.0リリース http://seleniumhq.org/docs/01_introducing_selenium.html#brief-history-of-the-selenium-project 8
  • 9. Selenium1とWebDriver  Selenium1の課題  テスト・ドライバーがブラウザ上で稼働するため、ブラ ウザのサンドボックスの制限を受ける  原理的に対応が難しい機能がある  ファイルアップロードなど  Ajax対応  WebDriver  テスト・ドライバーがブラウザ外部で稼働するため上記 の制限を受けない  Headless Driver(HtmlUnit)に対応  詳細な比較については以下 http://www.asukaze.net/etc/webdriver/ 9
  • 10. Geb(じぇぶ)とは http://www.gebish.org/  Groovyで構築されたWebDriverのラッパー  jQueryライクなNavigator APIを提供  Page Objectパターンによる構造化  2011/10時点での最新バージョンは0.6  多様なテストフレームワークと統合可能  Spock,EasyB  JUnit3/4,TestNG  Cucumber(Cuke4Duke) 10
  • 11. jQuery-like Navigator API // CSS 3 selectors $("div.some-class p:first[title='something']") // Find via index and/or attribute matching $("h1", 2, class: "heading") $("p", name: "description") $("ul.things li", 2) // 'text' is special attribute for the element text content $("h1", text: "All about Geb") // Use builtin matchers and regular expressions $("p", text: contains("Geb")) $("input", value: ~/d{3,}-d{3,}-d{3,}/) // Chaining $("div").find(".b") $("div").filter(".c").parents() $("p.c").siblings() 11
  • 12. Page Objectパターン class LoginPage extends Page { ログイン画面 static url = "http://myapp.com/login" static at = { heading.text() == "Please Login" } static content = { heading { $("h1") } loginForm { $("form.login") } loginButton(to: AdminPage) { loginForm.login() } } } Browser.drive { テスト to LoginPage assert at(LoginPage) loginForm.with { username = "admin" class AdminPage extends Page { password = "password" static at = { heading.text() == "Admin Section" } } static content = { loginButton.click() heading { $("h1") } assert at(AdminPage) } } } 管理画面 12
  • 13. Gebの例: はてなキーワード検索 @Grapes([ @Grab("org.codehaus.geb:geb-core:latest.release"), @Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release") ]) import geb.Browser Browser.drive { go "http://d.hatena.ne.jp/keyword/" assert title == "はてなキーワード - 話題の言葉がわかる、みんなで編集す るキーワード" $("form.header-search").word = "Groovy" $("form.header-search").find("input", name:"submit").click() assert title == "はてな検索: Groovy" } 13
  • 14. Spock(すぽっく)とは http://code.google.com/p/spock/  Groovyで構築されたBDDフレームワーク  Groovyの動的型を活用したDSLを提供  Power Assertで問題箇所を容易に特定可能  可読性の高いテストケース  データ・ドリブン・テストにより多数のテストパターン をコンパクトに記述可能  テストケースはJUnitから実行可能 14
  • 15. Power Assert def a = 1 def b = 2 def c = 3 assert (a+b)*c == 5 途中結果や、どこでfailしたかまで教えてく れる。 assertEquals()とかを組み合わせる必要ナシ。 15
  • 16. 可読性の高いテストケース def "subscribers receive published events at least once"() { when: publisher.send(event) then: (1.._) * subscriber.receive(event) where: event << ["started", "paused", "stopped"] } def "length of Spock's and his friends' names"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } 16
  • 17. GebとSpockのインテグレーション  Gebと連携するSpockのテストケースとして以下が 提供される  geb.spock.GebSpec / GebReportingSpec  browserインスタンスの注入  WebDriverのBrowserクラスの初期化が不要  エビデンス取得の自動化  GebReportingSpecを利用すると、テストケースのメソッ ド終了時にスクリーンショット(PNG)が自動取得される 17
  • 18. GebReportingSpecの例 @Grab("org.codehaus.geb:geb-spock:0.6.0") @Grab("org.spockframework:spock-core:0.5-groovy-1.8") @GrabExclude("org.codehaus.groovy:groovy-all") @Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release") import geb.spock.GebReportingSpec class FunctionalReportingSpec extends GebReportingSpec { def "Hatena Keyword Search Top"() { when: go "http://d.hatena.ne.jp/keyword/" then: title == "はてなキーワード - 話題の言葉がわかる、みんなで編集するキーワード" } def "Hatena Keyword Search Result"() { when: $("form.header-search").word = "Groovy" $("form.header-search").find("input", name:"submit").click() then: assert title == "はてな検索: Groovy" } } 18
  • 19. GebSpec利用時の注意点  Spock-0.5(2011/10時点)ではGroovyの@Grabを利用 する場合は、依存関係の兼ね合いで以下が必要  @GrabExclude("org.codehaus.groovy:groovy-all")  GebReportingSpecを利用する場合はレポート出力先 のディレクトリを指定しておく必要がある  最も簡単なのはシステムプロパティを使うこと  groovy -Dgeb.build.reportsDir=/tempdir GebSpockReporting.groovy 19
  • 20. JGGUGからのお知らせ  G*ワークショップ  だいたい月1回のペースでG*関連の勉強会を実施してい ます  次回は11/22予定、Gebの詳しい話を予定  詳細は http://www.jggug.org/ で  G*Magazine  http://grails.jp/g_mag_jp/  JGGUGが発行している電子雑誌です。  創刊号と第3号に、@bikisukeさんがGeb/Spockの技術情 報を執筆されています。 20