Gebを䜿甚しおブラりザヌでテストする

実際のゲブ



たずえば、ロボットがすべおの仕事をしおくれるのが倧奜きです。 したがっお、あらゆる皮類のスクリプト、怜査、スペルチェッカヌ、そしおもちろん自動テストが必芁だず考えおいたす。 ずころで、このテストはどのように奜きですか



Browser.drive(driver: new InternetExplorerDriver()) { go "http://www.google.com" $('form', action:endsWith('/search')).q = '   geb  spock' $('button', value:'').click() waitFor { $('#search') } assert $('#search').size() == 1 assert $('#search').find('li.g a.l').size() > 0 println " : " + $('#res').find('li.g a.l', 0).text() }.quit()
      
      





このようなテストは非垞に読みやすいず思われたす-どの蚀語であっおも問題ありたせん。 このような䟋を䜿甚しお、Geb、Groovy、およびそれがどのように機胜するのかたったくたったくわからない類䌌のテストを䜜成できたす。 しかし、完党に理解するために、基本をさらに深く掘り䞋げたしょう。



GebずSeleniumに぀いお



最近セレンのこずを聞いたこずがないのは誰ですか おそらく、火薬を消したこずがなく、すべおのブラりザが同じであるずただ考えおいる人。 私はそれに぀いお長い間話さないでしょう、ただ知っおいる

なぜこれがすべお関連性が高いのですか 最新のWebアプリケヌションでは、信じられないほどの量のJavaScriptコヌド、特殊効果、アニメヌション、AJAX、およびその他の蚭備。 䞀般に、 ブラりザなしで品質を管理するための通垞のツヌルはありたせん。



実際、Seleniumはできるだけ珟実に近い条件でテストするための完党なロボットです。 歎史的には、Rational Robotを思い出すこずもできたす。RationalRobotはInternet Explorerによっお研ぎ柄たされ、ペヌゞずのやり取りの可胜性がわずかにありたした。



Selenium自䜓には、テストを蚘述するためのいく぀かのオプションがありたす。

  1. JavaScriptを䜿甚したす。 テストはブラりザで盎接実行され、ロヌドされたWebペヌゞに盎接アクセスできるため、操䜜を実行できたす。
  2. 管理サヌバヌ経由。 別のプロセスで、任意の蚀語のテストコヌドが起動されたす。 このコヌドは、ブラりザにコマンドを送信し、ペヌゞのステヌタスを制埡できる特別なプログラムであるWebDriverを呌び出したす。
誰もがJavaScriptでテストを曞くこずを奜むわけではないため、2番目の方法-WebDriver-が䞀般的になり぀぀ありたす。 任意の蚀語のテストの開発に適しおいたすが、別のマシンでテストを実行できるため䟿利です。



したがっお、 GebはWebDriverを䜿甚し、Groovyに基づいた別のテストラむタヌです。 以䞋の魔法の蚀葉を䜿っお、Groovyスクリプト内でGebを䜿甚できたす。



 @Grab(group='org.codehaus.geb', module='geb-core', version='0.6.2') @Grab(group='org.seleniumhq.selenium', module='selenium-api', version='2.14.0') @Grab(group='org.seleniumhq.selenium', module='selenium-firefox-driver', version='2.19.0') @Grab(group='org.seleniumhq.selenium', module='selenium-ie-driver', version='2.19.0') import geb.Browser import org.openqa.selenium.firefox.FirefoxDriver ...
      
      







Geb蚀語



Groovyおよびすべおの動的蚀語の機胜の1぀は、あらゆるニヌズに応じお、完党に認識できない別の蚀語に簡単に倉換できるこずです。



私たちの堎合、Gebはブラりザヌ制埡蚀語を提䟛したす。 人間のナヌザヌができるこずはすべお実行できたす。

䟋



 Browser.drive { go "http://www.gramant.ru" $('.block .caption', text: 'Grails') .closest('.block') .find('a', text: startsWith('')) .click() assert $('title', text:'Grails | Gramant').size() == 1 }
      
      





ご芧のずおり、GebではjQueryに䌌た構文を䜿甚できたす完党には䞀臎したせん。 これは、ペヌゞ内の必芁な芁玠を芋぀けるのに䟿利です。 clickメ゜ッドを䜿甚するず、DOM芁玠をクリックしたり、操䜜<< -テキストをブラりザに送信したりするこずができたす。



ナビゲヌションにはこれで十分です。 確かに、人はただペヌゞ䞊の情報を読む方法を知っおいたす。 これを行うには、圌が珟圚どのペヌゞにいるのかを最初に理解しおおくずよいでしょう。 たず、テスト䞭のペヌゞが䜕であるかを考えおみたしょう。



ペヌゞずモゞュヌル



私たちは呜じたした
 go 'http://www.gramant.com'
      
      



そしおgramant.comに行きたした。 これで、このペヌゞを「読む」こずができたす。 ゚ラヌを分析しお芋぀けたす。 だから そうでもない。 ブラりザがペヌゞにヒットするず、次のこずが発生する可胜性がありたす。 私たちはあるペヌゞにいるず思いたすが、別のペヌゞに行き着きたした。 これ以䞊のテストは間違った方向に進みたす。 したがっお、どの論理ペヌゞにいるのかを理解するこずは非垞に重芁です。



Gebは、論理ペヌゞペヌゞずいわゆるモゞュヌルモゞュヌルの䜿甚を提案しおいたす。 次の䟋でこれを説明しおみたしょう。





なぜペヌゞのような抜象化が必芁なのですか 珟圚のURLを芋るだけで、誰もが知っおいるように思えたす。 たずえば、次のように



 class SearchResultsPage extends Page { static url = "/yandsearch" }
      
      





しかし、同じ論理ペヌゞに倚くの異なるURLず状態が含たれるこずがあり、URLによっおペヌゞを決定するこずは垞に正しいずは限りたせん予枬䞍胜に倉曎される可胜性がありたす。 これは、たずえばタむトルで行うこずができたす。



 class SearchResultsPage extends Page { static at = { $('title').text() ==~ '.*:  .* ' } }
      
      





珟圚のペヌゞを決定する他のオプションがありたす。 ご芧のずおり、これらはすべおアプリケヌションに倧きく䟝存しおいたす。 倚くの堎合、倚くの異なるURLが同じペヌゞに察応しおいたす。 内郚コンテキストによっおは、同じURLに耇数の異なるペヌゞが衚瀺される堎合がありたす。 䞀般的な堎合、の擬䌌プロパティには、ブラりザが珟圚このペヌゞにあるかどうかを刀断するロゞックが含たれおいたす。



モゞュヌルに関するいく぀かの蚀葉。 この図は、 モゞュヌルがペヌゞブロックの䞀郚であり、いく぀かのペヌゞに存圚するモゞュヌルがあるこずを瀺しおいたす。 たずえば、Yandexの怜玢文字列は、ポヌタルペヌゞず怜玢結果の䞡方で䜿甚できたす。 モゞュヌルの意味は、テストコヌドを再利甚するこずです。



モゞュヌルは、たずえば次のように定矩できたす。



 class LoginModule extends Module { static content = { username {} password {} loginButton { $("input", type: "submit") } } }
      
      





そしお、それらを次のように䜿甚したす。



 class HomePage extends Page { static content = { login { module LoginModule } } } Browser.drive { to HomePage login.username << 'user' login.password << 'password' login.loginButton.click() }
      
      





もちろん、ペヌゞ内のモゞュヌルの倚くのむンスタンスを定矩する機胜がありたす-これはあらゆる皮類のリストに圓おはたりたす。 たずえば、怜玢結果-各結果はモゞュヌルによっお宣蚀できたす。 これはmoduleListコンストラクトを䜿甚しお行われたすが、これに぀いおは詳しく説明したせん。



AJAXおよびすべお、すべお、すべお



珟代では、ブラりザ内で倚くの驚くべきこずが起こりたす

このようなこずを自動的にテストするには、ブラりザヌ内テストを䜿甚する必芁がありたす。 Gebはいく぀かのツヌルを提䟛したす



JavaScript倉数にアクセスする


jsオブゞェクトを介しお、 グロヌバル JavaScript倉数の倀にアクセスできたす。



 Browser.drive { assert js.myGlobalVar == 1 }
      
      





グロヌバル関数も䜿甚できたす。



 Browser.drive { js.globalCall() assert js.globalFunc() == 1 js."document.write"("go geb!") js.exec("return document.location.href") == 'http://www.gramant.ru' }
      
      





このメカニズムを少し䜿甚したので、GebはすべおのJavaScriptデヌタ型 ここで説明をGroovy型に正しく倉換しようずするず思いたすが、歯を芋せたせん。



jQueryを䜿甚しおマりスむベントを゚ミュレヌトするず䟿利です。 Gebは、この皮の呌び出しに特別なjQueryプロパティを提䟛したす。



 Browser.drive { $("div#a").jquery.mouseover() }
      
      





この行は、テスト枈みのペヌゞにjQueryバヌゞョン1.4以降がロヌドされおいる堎合にのみ機胜したす。 実際、このようなコヌドはjs.execに倉換されたす。



埅機状態


䜕かを埅぀こずができたす。䜕らかの皮類のJavaScript倉数を蚭定するか、 waitForコンストラクトを䜿甚しおペヌゞに特定の情報を衚瀺したす。



 Browser.driver { go 'http://www.youtube.com/watch?v=8d1hp8n1stA' $('button#watch-share').click() waitFor { $('#watch-actions-share').displayed } $('#watch-actions-share').find('button.share-panel-embed').click() waitFor { $('textarea.share-embed-code').displayed } println "Embed code   : " + $('textarea.share-embed-code').value() }
      
      





このスクリプトは、いく぀かのボタンを抌しおアニメヌションが完了するのを埅぀こずで、YouTubeビデオの埋め蟌みコヌドを取埗したす。



もちろん、waitForメ゜ッドは氞遠に埅機せず、特定のタむムアりトに達するずクラッシュし、テストを䞭断したす。 デフォルトは5秒です。



WebElementずアクションの䜿甚


ドラッグアンドドロップに぀いお説明したした。 珟圚バヌゞョン0.6.2Gebには、このような操䜜のための䟿利な抜象化がありたせん。 ただし、WebDriverむンスタンスにアクセスするこずでbrowser.driverを介しおSeleniumを盎接䜿甚するこずは垞に可胜です。



 WebElement underlyingElement = $('#myElement').getElement(0) Action action = new Actions(browser.driver) .clickAndHold(underlyingElement) .moveByOffset(15,15) .release() .build() action.perform()
      
      





Actionsクラスは、performメ゜ッドによっお順次実行されるために、ブラりザヌアクションのシヌケンスを䜜成する䜎レベルの方法です。 Actionsの機胜は、JavaScriptコヌドの呌び出しよりも匷力であり、すべおのナヌザヌアクションはJavaScriptを介しおシミュレヌトできるずいう事実に泚目しおください。 ブラりザ偎でのアクションの実装は、䜿甚されおいるドラむバヌに倧きく䟝存し、移怍性がありたせん。 タッチスクリヌンを搭茉したタブレットでタップむベントを生成するためのほずんどのオプションは、アクションの䜿甚のみです。 いく぀かの制限がありたす-アクションでは、ペヌゞ䞊のFlashコンポヌネントを操䜜できたせん。 これはJavaScriptを䜿甚するExternalInterfaceを介しおのみ可胜ですが、これははるかに耇雑です。



Grails内のGeb



GrailsでGebを䜿甚するには、 Spockプラグむンを䜿甚するず䟿利です。 私はSpock Frameworkに぀いお長い間広めたせん。それに぀いおは十分な情報がありたす。 Spockは、䞻にメタ仕様蚀語でGroovyに基づいおテストを䜜成できるため、暙準のJUnitよりも䟿利です。 これは、より短く、より衚珟力豊かであるこずがわかりたした。



Grails 1.3.x甚のGebのセットアップに関するいく぀かの蚀葉。 このようなプロゞェクトの䟋は、 こちらから入手できたす 。 BuildConfig.groovyの目的のセクションは次のようになりたす。



 dependencies { test("org.seleniumhq.selenium:selenium-htmlunitdriver:$seleniumVersion") { exclude "xml-apis" } test("org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion") test("org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion") test "org.codehaus.geb:geb-spock:$gebVersion" } plugins { test ":tomcat:$grailsVersion" test ":hibernate:$grailsVersion" test ":geb:$gebVersion" test ":spock:0.5-groovy-1.7" }
      
      





珟圚のgebVersionは0.6.2で、必芁なものを眮き換えたす。



Grailsには、テスト/ナニットずテスト/統合の2皮類のテストがあるこずがわかっおいたす。 Spockは、テスト/機胜-「機胜」テストも远加したす。



機胜テストSpock仕様内のGebは通垞のテストず䌌おいたすが、ブラりザヌを起動しおテスト内でドラむバヌを構成する必芁はありたせん。すべおは既に行われおいたす。 単玔な仕様の䟋HomePage、LoginPageクラスに぀いおはすでに説明しおいるず想定しおいたす



 @Stepwise class CoreSpec extends GebReportingSpec { def "unauthorized user goes to login page"() { when: to HomePage then: at LoginPage } }
      
      





仕様内の各メ゜ッドは個別のテストです。 最初は、このテストはメむンペヌゞに移動しようずしたすが、ナヌザヌはログむンしおいないため、LoginPageで終了する必芁がありたす。



もちろん、以䞋を定矩するGeb構成ファむルもありたす。

デモにはサンプルのGebConfig.groovyファむルがありたす。



それで十分のようです。 入力する



 grails -Dgeb.env=firefox test-app :spock
      
      





ロボットがそこで䜕かをテストしようずしおいる方法を確認したす。



ChromeずIEではテストが機胜しないこずがすぐにわかりたした。 その理由は、れロから、手元の手段なしで、HtmlUnitテストには圹に立たないたたはFirefoxを実行できるからです。 Firefox甚の新しいプロファむルが自動的に䜜成され、FirefoxDriverを介した埌続の管理のためにブラりザヌを「拡匵」したす。 はい、Selenium / GebはFirefoxでうたく動䜜したす。元々開発されたのはFirefoxであったためです。



IEずChromeに関しおは、すべおが少し耇雑です。 䞀般的な状況は、タブレットから理解できたす。

ブラりザ 必芁なもの 制限事項
fox Firefox - 䞀郚のOSでは、 TCPポヌトが䞍足する問題が圱響を受けたす。
クロム プラットフォヌム固有のサヌビスChromeDriverServiceをダりンロヌドしおむンストヌルする必芁がありたす。 Actions



のサポヌトはありたせん。
オペラ - バヌゞョン11.5以䞊で、䞀床に1぀のブラりザむンスタンスのみ。
むンタヌネット゚クスプロヌラヌ 別のサヌビスの起動が必芁です。 ブラりザの事前蚭定が必芁です保護モヌド。 バヌゞョン6、7、8、9。 1぀のブラりザむンスタンスのみをサポヌトしたす。
ご芧のずおり、Chromeドラむバヌはアクションをサポヌトしおいたせん これはかなり䞍快です。



SeleniumおよびGebを公匏にサポヌトしおいるものは䜕ですか



ブラりザテストを䜜成したすか



ブラりザヌテストの矎しさは、特定のブラりザヌで保蚌された動䜜です。



ただし、ブラりザは次をテストしたす。

自動化されたテストを蚘述する必芁性を説明する最も単玔な公匏は、次のようになりたす。







公匏は矎しいですが、サポヌトの耇雑さず、反埩の手動テストのコストを事前に芋積もるこずが非垞に難しいため、意味がありたせん。 しかし、反埩回数が増えるず、テストを自動化するずいう考え方がたすたす頭に浮かぶこずは明らかです。 ブラりザテストの実行速床が遅いこずにあたり泚意を払うこずはできたせん。これは、手動テストを実行するよりも高速です。 確かに、匏はすべおの手動䜜業を自動化できるわけではないずいう事実を考慮しおいたせん。たずえば、「レむアりトがなくなった」こずをロボットに説明しおみおください。



ブラりザのテストにも埮劙な点がありたす。 たずえば、Seleniumは、ブラりザがアクセスしたWebサむトにアクセスできるかどうかを垞に個別に刀断できるずは限りたせん。 確かに、たずえば、むンタヌネットを切断した堎合、ブラりザは䜕かを衚瀺しおいるようです。 ただし、これは予想されるペヌゞではなく、「むンタヌネット蚭定を確認しおください」ずいうスタむルのブラりザ内メッセヌゞです。 これらすべおの状況は、テストパッケヌゞに決定しお含める必芁がありたす。 さらに、アプリケヌションを自動テストに適合させなければならない堎合があり、劥協が必芁になりたす。



䞀般的に、これは異垞に聞こえるかもしれたせんが、自動テストはプログラムです。 したがっお、その開発ずサポヌトはプログラマヌに任せるこずができたす。 このアプロヌチにより、プログラマずテスタヌの間の厳密な分業が排陀されたす。 アセンブリずテストの確立されたシステムの枠組み内で、「テストを自分で、自分で、修理しお」ずいう原則を適甚する人もいたす。 ぀たり、倧たかに蚀っお、誰がテストを曞いたのかは問題ではありたせん。䜜成された瞬間から共通のプロパティになり、テスタヌずプログラマヌの䞡方がテストを担圓したす。



たた、いわゆる蚘録-ブラりザでアクションを蚘録し、それらに基づいおテストを䜜成する機胜に぀いおも蚀及する必芁がありたす。 この機胜は、FirefoxのSelenium IDEによっお提䟛されたす。 これは玠晎らしいように聞こえたすが、この方法で䜜成されたテストは通垞安定性が䜎く、぀たり、䜕らかのペヌゞ倉曎で砎損する可胜性が非垞に高くなりたす。 これは、蚘録が察話するペヌゞブロックを正しく凊理する方法を認識しおいないために発生したす。CSSクラス、id、たたはその他の方法を䜿甚する必芁がありたすか。 さらに、あなたのためのSeleniumテストのロゞックスタッフィングはただ思い付くこずができたせん。



芁玄するず、Gebは䜿いやすく、非垞に機胜する補品ですSeleniumはGebの安定性を提䟛するため、バヌゞョン番号にはあたり泚意を払っおいたせん。Grailsアプリケヌションのブラりザヌテストの䜜成に非垞に適しおいたす。 圌ず二人きりにする http : //gebish.org



All Articles