SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
入門Geb+Betamax

               2011/11/22
    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
本日のお題
 テスト自動化について
 Geb入門
 Betamax入門
 Geb+Spock+Betamaxでgrails test-app




3
テスト自動化、しましょうか?
   Vモデル
                                                       ここは未だに
                                                       人海戦術が
                                                       主流



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




    http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB
4
自動化できれば・・・
   テスト実行に伴う人的コストが不要になる
       リファクタリングに取り組み易くなる
       バグフィックスや機能修正によるリリース頻度を上
        げられる
       ミドルウェアやOSのFix適用に躊躇しなくてよくなる
   テストの品質を上げられる
       手作業に完全ということはありえない
       手作業は監査できない



5
とはいえ・・・
   受け入れテスト(UAT)の完全自動化は大変
       ならば、せめてスモークテストだけでも自動化を
       人手によるテストやパフォーマンステストの前の関
        門として、CIのプロセスに組み込んでみては?




          http://en.wikipedia.org/wiki/Smoke_testing
6
Gebる前に: Seleniumの系譜
            2004~

        Selenium1
      (Selenium RC)                         Selenium2


            Selenium IDE
                                                                                 2009~

                                                                         Selenium2
           Selenium-Grid                                                 +WebDriver

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

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

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

    8
WebDriver: Java APIサンプル
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();
  }
}
 9
ちょっとめんどい

10
そこでGeb(じぇぶ)ですよ
                                         http://www.gebish.org/

    Groovyで構築されたWebDriverのラッパー
        jQueryライクなNavigator APIを提供
        Page Objectパターンによる構造化
            WebDriver単体でも使えるが、より使いやすく
        2011/11/22時点での最新バージョンは0.6.1
            GitHub上の最新は0.7.0-SNAPSHOT
    多様なテストフレームワークと統合可能
        Spock,EasyB
        JUnit3/4,TestNG
        Cucumber(Cuke4Duke)

    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()

 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)
    }                                                    }
}                                            管理画面

     13
Gebの例: はてなキーワード検索
@Grapes([
 @Grab("org.codehaus.geb:geb-core:0.6.1"),
 @Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.12.0")
])
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"
}

    14
GebとSpockのインテグレーション
   Gebと連携するSpockのテストケースとして以
    下が提供される
       geb.spock.GebSpec / GebReportingSpec
   browserインスタンスの注入
       WebDriverのBrowserクラスの初期化が不要
   evidence取得の自動化
       GebReportingSpecを利用すると、テストケースのメ
        ソッド終了時にスクリーンショット(PNG)が自動取得
        される

15
Geb ドキュメント&サンプル
   The Book Of Geb
       http://www.gebish.org/manual/current/
       かなり詳しいドキュメント

   Gebソースコード
       https://github.com/geb/geb

   Geb/Gradleサンプル
       https://github.com/geb/geb-example-gradle

16
ChromeDriver利用時の注意点
    ChromeDriverを実行可能にしておくこと
        http://code.google.com/p/selenium/wiki/ChromeDriver
        バイナリをダウンロード
          http://code.google.com/p/chromium/downloads/list
        パスに追加
         or システムプロパティ webdriver.chrome.drive を設定




    17
GebReportingSpecの例
class GoogleSpec extends GebReportingSpec {
        def "the first link should be wikipedia"() {
                when:
                        to GoogleHomePage
                and:
                        search.forTerm "wikipedia"
                then:
                        at GoogleResultsPage
                and:
                        firstResultLink.text() == "Wikipedia"
                when:
                        firstResultLink.click()
                then:
                        waitFor { at WikipediaPage }
        }

}

    18
GebSpec利用時の注意点
   GebReportingSpecを利用する場合はレポート
    出力先のディレクトリを指定しておく必要があ
    る
       最も簡単なのはシステムプロパティを使うこと
       groovy -Dgeb.build.reportsDir=/tempdir
        GebSpockReporting.groovy




19
Gebについて詳しくは・・・
   G*Magazine
       http://grails.jp/g_mag_jp/
       創刊号と第3号に、@bikisuke さんがGeb/Spock
        の技術情報を執筆
   GitHub
       https://github.com/kimukou/gradlestudy/tre
        e/master/geb-geb-example
       @kimukou_26 さん作成サンプル



20
Betamax                http://robfletcher.github.com/betamax/




   WebサービスのRecord/Playback Proxy
       HTTPリクエスト/レスポンスをtapeに記録
       tapeを利用してWebサービスをエミュレート
 JUnit/Spockとのインテグレーション
 vcr(Ruby)のクローン
       https://www.relishapp.com/myronmarston/vcr
       vcrのcassetと互換性あり?(未確認)

21
Hello, Betamax
    <任意のディレクトリ>
    │ build.gradle
    └─src
      └─test
        └─groovy
              MySpec.groovy


   "gradle test"を実行すると、
    src/test/resources/betamax/tapesにtapeが作成される
   同じリクエストに対してはBetamaxがtapeを再生する
        デフォルトではURLとHTTPメソッドの対で同一性を判定

    22
build.gradle
apply plugin: "groovy"
repositories {
  mavenCentral()
}
dependencies {
  groovy("org.codehaus.groovy:groovy-all:1.8.4")
  testCompile("com.github.robfletcher:betamax:1.0")
  testCompile(
        "org.codehaus.groovy.modules.http-builder:http-builder:0.5.1") {
     exclude module: "groovy"
     exclude module: "httpclient"
  }
  testCompile("org.spockframework:spock-core:0.5-groovy-1.8") {
     exclude module: "groovy-all"
  }
}
 23
MySpec.groovy
import betamax.*
import spock.lang.*
import org.junit.*
import groovyx.net.http.RESTClient
import org.apache.http.impl.conn.ProxySelectorRoutePlanner

class MySpec extends Specification {
  @Rule Recorder recorder = new Recorder()
  @Shared RESTClient http = new RESTClient()
  def setupSpec() {
      http.client.routePlanner = new ProxySelectorRoutePlanner(
        http.client.connectionManager.schemeRegistry, ProxySelector.default)
  }
  @Betamax(tape="my tape")
  def "various types of response data"() {
    when:
      def response = http.get(uri:"http://grails.org/")
    then:
      response.status == 200
    }
}
  24
その他のサンプル
   今のところまとまったドキュメント等はないの
    で、ソースコードからビルドして試すのがおす
    すめ
       https://github.com/robfletcher/betamax
       そろそろGitには慣れておいた方がいい
   ビルド時の注意点
       SonaTypeのアカウント設定
       テストが一部通らない・・・が無視してOK


25
SonaTypeのアカウント設定
   素直にビルドすると以下のエラーが
       A problem occurred evaluating root project 'betamax'.
        Cause: No such property: sonatypeUsername for class:
        org.gradle.api.internal.artifacts.publish.maven.deploy.groo
        vy.DefaultGroovyMavenDeployer
       SonaTypeのアカウントなんて持ってないよママン!

   以下で対処してください
       gradle.propertiesを作成(値は空白で可)
        [gradle.properties]
        sonatypeUsername=
        sonatypePassword=


26
テストが一部通らない
   時刻の扱いに問題あり(Timezoneを考慮して
    いない)だが、テストケース側の問題なので無
    視してOK
       一応pull requestしたけど放置されてます。。。
       他にもいくつか問題あり。ぜひパッチを!




27
Grails + Geb + Betamax
   ソースのexamples/grails-betamax以下




              ← 機能テスト(Spock+Geb+Betamax)

           ← tape(Twitter API呼出し)

              ← ユニットテスト(Spock+Betamax)

28
tape
   YAMLでHTTPリクエスト/レスポンスを記録
      !tape
      name: twitter success
      interactions:
      - recorded: 2011-08-31T13:12:42.293Z
        request:
         method: GET
         uri: http://search.twitter.com/search.json?q=betamax&rpp=10&page=1
         headers:
          Accept: application/json
          Accept-Encoding: gzip,deflate
          Host: search.twitter.com
          Proxy-Connection: Keep-Alive
        response:
         status: 200
         headers:
          Age: '0'
          Cache-Control: max-age=15, must-revalidate, max-age=300
          Content-Encoding: gzip
          Content-Type: application/json;charset=utf-8
          Date: Wed, 31 Aug 2011 13:12:42 GMT
          Expires: Wed, 31 Aug 2011 13:17:42 GMT
          Server: hi
          Vary: Accept-Encoding
          Via: 1.1 varnish
          X-Varnish: '2033991101'
         body: |-
          {
              "completed_in": 0.072,
29            "max_id": 108888091493801987,
tapeの利用価値
   Web APIにアクセスできない状況でもテストが
    できる
       新幹線で移動することが多い人向け
   テストを高速化できる
       いちいちサーバーにアクセスしなくてすむ
   テスト結果を安定化できる
       サーバー側の変化からテストを分離できる
   レアケースに対するテストを容易にできる
       TwitterのAPI呼出し制限に引っ掛かった場合など
   tapeを再利用(資産化)できる
30
Betamaxはまり道
   基本的にはRecorderと@Betamaxだけで
    いけるはず!
       組合せによっていろいろ起こります。。。。
       とりあえずGroovy-1.8/HTTPBuilderの組合せが
        おすすめ
       素のURLクラスを使うと、 java.io.IOException:
        Premature EOF ???
       400 Bad Request ???
   品質向上にご協力下さい
"Please raise issues on Betamax’s GitHub issue tracker. Forks and
pull requests are more than welcome." by Rob Fletcher
31
ご静聴
ありがとう
ございました
32

Más contenido relacionado

La actualidad más candente

「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてYuya Takahashi
 
System4 detail for_h
System4 detail for_hSystem4 detail for_h
System4 detail for_hJun Chiba
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012Yusuke Ando
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & ListenersTaisuke Oe
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門keroyonn
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generatorOda Shinsuke
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明furusin
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能hitode909
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019David Buck
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構katanyan
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 

La actualidad más candente (20)

「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() について
 
System4 detail for_h
System4 detail for_hSystem4 detail for_h
System4 detail for_h
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & Listeners
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
 
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 

Destacado

Html5勉強会 20120423
Html5勉強会 20120423Html5勉強会 20120423
Html5勉強会 20120423Nobuhiro Sue
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427Nobuhiro Sue
 
Gws 20140418 camel_groovy
Gws 20140418 camel_groovyGws 20140418 camel_groovy
Gws 20140418 camel_groovyNobuhiro Sue
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222Nobuhiro Sue
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_introNobuhiro Sue
 
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
 
20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_GroovyNobuhiro Sue
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDCNobuhiro Sue
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_introNobuhiro Sue
 
Light and shadow of microservices
Light and shadow of microservicesLight and shadow of microservices
Light and shadow of microservicesNobuhiro Sue
 
JSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpJSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpNobuhiro Sue
 

Destacado (11)

Html5勉強会 20120423
Html5勉強会 20120423Html5勉強会 20120423
Html5勉強会 20120423
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427
 
Gws 20140418 camel_groovy
Gws 20140418 camel_groovyGws 20140418 camel_groovy
Gws 20140418 camel_groovy
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_intro
 
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
 
20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy20140329_kyon_kao_wedding_LT_Groovy
20140329_kyon_kao_wedding_LT_Groovy
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_intro
 
Light and shadow of microservices
Light and shadow of microservicesLight and shadow of microservices
Light and shadow of microservices
 
JSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocpJSUG20171027-spfingboot-k8s-ocp
JSUG20171027-spfingboot-k8s-ocp
 

Similar a G*workshop 2011/11/22 Geb+Betamax

TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideYusuke Tochigi
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみようOda Shinsuke
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょKohki Nakashima
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMiho Nakano
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」Aya Komuro
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷JavaToshiaki Maki
 

Similar a G*workshop 2011/11/22 Geb+Betamax (20)

TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for Design
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 

Más 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
 
Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)Gws 20131018 vertx_handson(updated)
Gws 20131018 vertx_handson(updated)Nobuhiro Sue
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309Nobuhiro 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
 
Letsgo sendai nobusue_20110528
Letsgo sendai nobusue_20110528Letsgo sendai nobusue_20110528
Letsgo sendai nobusue_20110528Nobuhiro Sue
 
DevSummit2011JGGUG OpenJam: Groovy
DevSummit2011JGGUG OpenJam: GroovyDevSummit2011JGGUG OpenJam: Groovy
DevSummit2011JGGUG OpenJam: GroovyNobuhiro Sue
 
G*workshop 20101209 OSGi and Grails2.0
G*workshop 20101209 OSGi and Grails2.0G*workshop 20101209 OSGi and Grails2.0
G*workshop 20101209 OSGi and Grails2.0Nobuhiro Sue
 
DevLOVE 20100823 EnterpriseOSGi
DevLOVE 20100823 EnterpriseOSGiDevLOVE 20100823 EnterpriseOSGi
DevLOVE 20100823 EnterpriseOSGiNobuhiro Sue
 
Gws sokai 20100724_nsue
Gws sokai 20100724_nsueGws sokai 20100724_nsue
Gws sokai 20100724_nsueNobuhiro Sue
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 

Más de Nobuhiro Sue (17)

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
 
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)
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 
クラウド研究会 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
 
Letsgo sendai nobusue_20110528
Letsgo sendai nobusue_20110528Letsgo sendai nobusue_20110528
Letsgo sendai nobusue_20110528
 
DevSummit2011JGGUG OpenJam: Groovy
DevSummit2011JGGUG OpenJam: GroovyDevSummit2011JGGUG OpenJam: Groovy
DevSummit2011JGGUG OpenJam: Groovy
 
G*workshop 20101209 OSGi and Grails2.0
G*workshop 20101209 OSGi and Grails2.0G*workshop 20101209 OSGi and Grails2.0
G*workshop 20101209 OSGi and Grails2.0
 
DevLOVE 20100823 EnterpriseOSGi
DevLOVE 20100823 EnterpriseOSGiDevLOVE 20100823 EnterpriseOSGi
DevLOVE 20100823 EnterpriseOSGi
 
Gws sokai 20100724_nsue
Gws sokai 20100724_nsueGws sokai 20100724_nsue
Gws sokai 20100724_nsue
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 

Último

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Último (10)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

G*workshop 2011/11/22 Geb+Betamax

  • 1. 入門Geb+Betamax 2011/11/22 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. 本日のお題  テスト自動化について  Geb入門  Betamax入門  Geb+Spock+Betamaxでgrails test-app 3
  • 4. テスト自動化、しましょうか?  Vモデル ここは未だに 人海戦術が 主流 ここはJUnitなどで わりかし自動化 できている http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB 4
  • 5. 自動化できれば・・・  テスト実行に伴う人的コストが不要になる  リファクタリングに取り組み易くなる  バグフィックスや機能修正によるリリース頻度を上 げられる  ミドルウェアやOSのFix適用に躊躇しなくてよくなる  テストの品質を上げられる  手作業に完全ということはありえない  手作業は監査できない 5
  • 6. とはいえ・・・  受け入れテスト(UAT)の完全自動化は大変  ならば、せめてスモークテストだけでも自動化を  人手によるテストやパフォーマンステストの前の関 門として、CIのプロセスに組み込んでみては? http://en.wikipedia.org/wiki/Smoke_testing 6
  • 7. Gebる前に: Seleniumの系譜 2004~ Selenium1 (Selenium RC) Selenium2 Selenium IDE 2009~ Selenium2 Selenium-Grid +WebDriver 2006~ 2011/07 WebDriver Selenium2.0リリース (Google) http://seleniumhq.org/docs/01_introducing_selenium.html#brief-history-of-the-selenium-project 7
  • 8. Selenium1とWebDriver  Selenium1の課題  テスト・ドライバーがブラウザ上で稼働するため、ブラ ウザのサンドボックスの制限を受ける  原理的に対応が難しい機能がある  ファイルアップロードなど  Ajax対応  WebDriver  テスト・ドライバーがブラウザ外部で稼働するため上記 の制限を受けない  Headless Driver(HtmlUnit)に対応  詳細な比較については以下 http://www.asukaze.net/etc/webdriver/ 8
  • 9. WebDriver: Java APIサンプル 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(); } } 9
  • 11. そこでGeb(じぇぶ)ですよ http://www.gebish.org/  Groovyで構築されたWebDriverのラッパー  jQueryライクなNavigator APIを提供  Page Objectパターンによる構造化  WebDriver単体でも使えるが、より使いやすく  2011/11/22時点での最新バージョンは0.6.1  GitHub上の最新は0.7.0-SNAPSHOT  多様なテストフレームワークと統合可能  Spock,EasyB  JUnit3/4,TestNG  Cucumber(Cuke4Duke) 11
  • 12. 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() 12
  • 13. 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) } } } 管理画面 13
  • 14. Gebの例: はてなキーワード検索 @Grapes([ @Grab("org.codehaus.geb:geb-core:0.6.1"), @Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.12.0") ]) 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" } 14
  • 15. GebとSpockのインテグレーション  Gebと連携するSpockのテストケースとして以 下が提供される  geb.spock.GebSpec / GebReportingSpec  browserインスタンスの注入  WebDriverのBrowserクラスの初期化が不要  evidence取得の自動化  GebReportingSpecを利用すると、テストケースのメ ソッド終了時にスクリーンショット(PNG)が自動取得 される 15
  • 16. Geb ドキュメント&サンプル  The Book Of Geb  http://www.gebish.org/manual/current/  かなり詳しいドキュメント  Gebソースコード  https://github.com/geb/geb  Geb/Gradleサンプル  https://github.com/geb/geb-example-gradle 16
  • 17. ChromeDriver利用時の注意点  ChromeDriverを実行可能にしておくこと  http://code.google.com/p/selenium/wiki/ChromeDriver  バイナリをダウンロード  http://code.google.com/p/chromium/downloads/list  パスに追加 or システムプロパティ webdriver.chrome.drive を設定 17
  • 18. GebReportingSpecの例 class GoogleSpec extends GebReportingSpec { def "the first link should be wikipedia"() { when: to GoogleHomePage and: search.forTerm "wikipedia" then: at GoogleResultsPage and: firstResultLink.text() == "Wikipedia" when: firstResultLink.click() then: waitFor { at WikipediaPage } } } 18
  • 19. GebSpec利用時の注意点  GebReportingSpecを利用する場合はレポート 出力先のディレクトリを指定しておく必要があ る  最も簡単なのはシステムプロパティを使うこと  groovy -Dgeb.build.reportsDir=/tempdir GebSpockReporting.groovy 19
  • 20. Gebについて詳しくは・・・  G*Magazine  http://grails.jp/g_mag_jp/  創刊号と第3号に、@bikisuke さんがGeb/Spock の技術情報を執筆  GitHub  https://github.com/kimukou/gradlestudy/tre e/master/geb-geb-example  @kimukou_26 さん作成サンプル 20
  • 21. Betamax http://robfletcher.github.com/betamax/  WebサービスのRecord/Playback Proxy  HTTPリクエスト/レスポンスをtapeに記録  tapeを利用してWebサービスをエミュレート  JUnit/Spockとのインテグレーション  vcr(Ruby)のクローン  https://www.relishapp.com/myronmarston/vcr  vcrのcassetと互換性あり?(未確認) 21
  • 22. Hello, Betamax <任意のディレクトリ> │ build.gradle └─src └─test └─groovy MySpec.groovy  "gradle test"を実行すると、 src/test/resources/betamax/tapesにtapeが作成される  同じリクエストに対してはBetamaxがtapeを再生する  デフォルトではURLとHTTPメソッドの対で同一性を判定 22
  • 23. build.gradle apply plugin: "groovy" repositories { mavenCentral() } dependencies { groovy("org.codehaus.groovy:groovy-all:1.8.4") testCompile("com.github.robfletcher:betamax:1.0") testCompile( "org.codehaus.groovy.modules.http-builder:http-builder:0.5.1") { exclude module: "groovy" exclude module: "httpclient" } testCompile("org.spockframework:spock-core:0.5-groovy-1.8") { exclude module: "groovy-all" } } 23
  • 24. MySpec.groovy import betamax.* import spock.lang.* import org.junit.* import groovyx.net.http.RESTClient import org.apache.http.impl.conn.ProxySelectorRoutePlanner class MySpec extends Specification { @Rule Recorder recorder = new Recorder() @Shared RESTClient http = new RESTClient() def setupSpec() { http.client.routePlanner = new ProxySelectorRoutePlanner( http.client.connectionManager.schemeRegistry, ProxySelector.default) } @Betamax(tape="my tape") def "various types of response data"() { when: def response = http.get(uri:"http://grails.org/") then: response.status == 200 } } 24
  • 25. その他のサンプル  今のところまとまったドキュメント等はないの で、ソースコードからビルドして試すのがおす すめ  https://github.com/robfletcher/betamax  そろそろGitには慣れておいた方がいい  ビルド時の注意点  SonaTypeのアカウント設定  テストが一部通らない・・・が無視してOK 25
  • 26. SonaTypeのアカウント設定  素直にビルドすると以下のエラーが  A problem occurred evaluating root project 'betamax'. Cause: No such property: sonatypeUsername for class: org.gradle.api.internal.artifacts.publish.maven.deploy.groo vy.DefaultGroovyMavenDeployer  SonaTypeのアカウントなんて持ってないよママン!  以下で対処してください  gradle.propertiesを作成(値は空白で可) [gradle.properties] sonatypeUsername= sonatypePassword= 26
  • 27. テストが一部通らない  時刻の扱いに問題あり(Timezoneを考慮して いない)だが、テストケース側の問題なので無 視してOK  一応pull requestしたけど放置されてます。。。  他にもいくつか問題あり。ぜひパッチを! 27
  • 28. Grails + Geb + Betamax  ソースのexamples/grails-betamax以下 ← 機能テスト(Spock+Geb+Betamax) ← tape(Twitter API呼出し) ← ユニットテスト(Spock+Betamax) 28
  • 29. tape  YAMLでHTTPリクエスト/レスポンスを記録 !tape name: twitter success interactions: - recorded: 2011-08-31T13:12:42.293Z request: method: GET uri: http://search.twitter.com/search.json?q=betamax&rpp=10&page=1 headers: Accept: application/json Accept-Encoding: gzip,deflate Host: search.twitter.com Proxy-Connection: Keep-Alive response: status: 200 headers: Age: '0' Cache-Control: max-age=15, must-revalidate, max-age=300 Content-Encoding: gzip Content-Type: application/json;charset=utf-8 Date: Wed, 31 Aug 2011 13:12:42 GMT Expires: Wed, 31 Aug 2011 13:17:42 GMT Server: hi Vary: Accept-Encoding Via: 1.1 varnish X-Varnish: '2033991101' body: |- { "completed_in": 0.072, 29 "max_id": 108888091493801987,
  • 30. tapeの利用価値  Web APIにアクセスできない状況でもテストが できる  新幹線で移動することが多い人向け  テストを高速化できる  いちいちサーバーにアクセスしなくてすむ  テスト結果を安定化できる  サーバー側の変化からテストを分離できる  レアケースに対するテストを容易にできる  TwitterのAPI呼出し制限に引っ掛かった場合など  tapeを再利用(資産化)できる 30
  • 31. Betamaxはまり道  基本的にはRecorderと@Betamaxだけで いけるはず!  組合せによっていろいろ起こります。。。。  とりあえずGroovy-1.8/HTTPBuilderの組合せが おすすめ  素のURLクラスを使うと、 java.io.IOException: Premature EOF ???  400 Bad Request ???  品質向上にご協力下さい "Please raise issues on Betamax’s GitHub issue tracker. Forks and pull requests are more than welcome." by Rob Fletcher 31