JJUG CCC 2011 Fall / Web test automation with Geb and Spock
Upcoming SlideShare
Loading in...5
×
 

JJUG CCC 2011 Fall / Web test automation with Geb and Spock

on

  • 3,672 views

 

Statistics

Views

Total Views
3,672
Views on SlideShare
3,623
Embed Views
49

Actions

Likes
7
Downloads
22
Comments
0

5 Embeds 49

https://twitter.com 38
http://paper.li 6
http://localhost 3
http://us-w1.rockmelt.com 1
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

JJUG CCC 2011 Fall / Web test automation with Geb and Spock JJUG CCC 2011 Fall / Web test automation with Geb and Spock Presentation Transcript

  • GebとSpockでWebテストを自動化せよ
    2011/10/17 @JJUG CCC 2011 Fall
     JJUG幹事/ JGGUGサポートスタッフ 須江 信洋
    http://twitter.com/nobusuehttp://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
  • 本日のお題
    なぜテスト自動化が大切なのか
    Webテスト自動化ツール Seleniumの系譜
    Gebとは
    Spockとは
    GebとSpockのインテグレーション
    3
  • テスト自動化できてますか?
    Vモデル
    4
    ここは未だに
    人海戦術が
    主流
    ここはJUnitなどで
    わりかし自動化
    できている
    http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB
  • 自動化できれば・・・
    テスト実行に伴う人的コストが不要になる
    リファクタリングに取り組み易くなる
    バグフィックスや機能修正によるリリース頻度を上げられる
    ミドルウェアやOSのFix適用に躊躇しなくてよくなる
    テストの品質を上げられる
    手作業に完全ということはありえない
    手作業は監査できない
    5
  • Continuous Delivery
    UATまで自動化することで道が拓ける
    6
    http://www.amazon.co.jp/dp/0321601912
  • なぜ自動化が進まないのか?
    テスト自動化にコストがかかりすぎる
    アプリ側の問題: テスト自動化を想定していない
    ツールの問題
    アプリの変更に追随するのが大変
    そもそも自動化できない場合がある
    ツールの制限など
    7
  • Seleniumの系譜
    8
    2004~
    Selenium1(Selenium RC)
    Selenium2
    Selenium IDE
    2009~
    Selenium2
    +WebDriver
    Selenium-Grid
    2006~
    2011/07
    Selenium2.0リリース
    WebDriver
    (Google)
    http://seleniumhq.org/docs/01_introducing_selenium.html#brief-history-of-the-selenium-project
  • Selenium1とWebDriver
    Selenium1の課題
    テスト・ドライバーがブラウザ上で稼働するため、ブラウザのサンドボックスの制限を受ける
    原理的に対応が難しい機能がある
    ファイルアップロードなど
    Ajax対応
    WebDriver
    テスト・ドライバーがブラウザ外部で稼働するため上記の制限を受けない
    Headless Driver(HtmlUnit)に対応
    詳細な比較については以下http://www.asukaze.net/etc/webdriver/
    9
  • WebDriver: Java APIサンプル
    10
    public class Selenium2Example {
    public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.google.com");
    WebElement element = driver.findElement(By.name("q"));
    element.sendKeys("Cheese!");
    element.submit();
    System.out.println("Page title is: " + driver.getTitle());
    (new WebDriverWait(driver, 10))
    .until(new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver d) {
    return d.getTitle().toLowerCase().startsWith("cheese!");
    }
    });
    System.out.println("Page title is: " + driver.getTitle());
    driver.quit();
    }
    }
  • Geb(じぇぶ)とは
    http://www.gebish.org/
    Groovyで構築されたWebDriverのラッパー
    jQueryライクなNavigator APIを提供
    Page Objectパターンによる構造化
    2011/10時点での最新バージョンは0.6
    多様なテストフレームワークと統合可能
    Spock,EasyB
    JUnit3/4,TestNG
    Cucumber(Cuke4Duke)
    11
  • jQuery-like Navigator API
    12
    // 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.thingsli", 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()
  • Page Objectパターン
    13
    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"
    password = "password"
    }
    loginButton.click()
    assert at(AdminPage)
    }
    テスト
    class AdminPage extends Page {
    static at = { heading.text() == "Admin Section" }
    static content = {
    heading { $("h1") }
    }
    }
    管理画面
  • Gebの例: はてなキーワード検索
    14
    @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"
    }
  • Spock(すぽっく)とは
    http://code.google.com/p/spock/
    Groovyで構築されたBDDフレームワーク
    Groovyの動的型を活用したDSLを提供
    Power Assertで問題箇所を容易に特定可能
    可読性の高いテストケース
    データ・ドリブン・テストにより多数のテストパターンをコンパクトに記述可能
    テストケースはJUnitから実行可能
    15
  • Power Assert
    def a = 1
    def b = 2
    def c = 3
    assert (a+b)*c == 5
    途中結果や、どこでfailしたかまで教えてくれる。assertEquals()とかを組み合わせる必要ナシ。
    16
  • 可読性の高いテストケース
    17
    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
    }
  • GebとSpockのインテグレーション
    Gebと連携するSpockのテストケースとして以下が提供される
    geb.spock.GebSpec / GebReportingSpec
    browserインスタンスの注入
    WebDriverのBrowserクラスの初期化が不要
    エビデンス取得の自動化
    GebReportingSpecを利用すると、テストケースのメソッド終了時にスクリーンショット(PNG)が自動取得される
    18
  • GebReportingSpecの例
    19
    @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"
    }
    }
  • GebSpec利用時の注意点
    Spock-0.5(2011/10時点)ではGroovyの@Grabを利用する場合は、依存関係の兼ね合いで以下が必要
    @GrabExclude("org.codehaus.groovy:groovy-all")
    GebReportingSpecを利用する場合はレポート出力先のディレクトリを指定しておく必要がある
    最も簡単なのはシステムプロパティを使うこと
    groovy -Dgeb.build.reportsDir=/tempdirGebSpockReporting.groovy
    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の技術情報を執筆されています。
    21
  • ご静聴ありがとうございました
    22