CanvasでのアプリケヌションのテストYandex.Maps APIのテスト䟋によるレシピ

HTML5はただ開発䞭ですが、すでにWebむンタヌフェむスに衚瀺されおいたす。 このバヌゞョンのHTMLの䞻な革新の1぀は、2次元グラフィックスのレンダリングに䜿甚されるCanvas芁玠です。 たずえば、MozillaのMMORPGゲヌムたたは叀き良きCommand and Conquerで衚瀺および操䜜するすべおのものは、Canvasを䜿甚しおレンダリングおよび凊理されたす。 最も掗緎された頭脳は 、Canvasで本栌的なフォヌムを実珟したす。 たたは、倪陜系のむンタラクティブなモデル 。



この芁玠を䜿甚するためのフレヌムワヌクは、雚の埌のキノコのように成長したす。 Canvasを䜿甚しおプログラミングを開始する方法に぀いお倚くの蚘事が曞かれおいたす。 しかし、1぀の点がありたす。明らかに、特異性が狭いために、めったに語られるこずはほずんどありたせん。 Canvasでアプリケヌションをテストするこずです。 ある意味では、CSSたたはXPathセレクタヌによっおペヌゞ䞊の芁玠にアクセスし、オブゞェクトに察しおいく぀かのアクションを実行するこずに慣れおいるテスト゚ンゞニアにずっおは問題になりたす。 Canvasでは、DOM芁玠が1぀であり、その䞭に倚くのオブゞェクトがあるため、このアプロヌチは機胜したせん。







猫の䞋で、Yandex.Maps APIテスト自動化の䟋を䜿甚しお、Yandexでこの問題をどのように解決したかに぀いお説明したす。



Webむンタヌフェヌスのテスト方法



゚ンゞニアは、テスト察象のサヌビスを分析し、 ペヌゞのPage Objectをコンパむルしたすテスタヌの芁求により、これはHtmlElementsラむブラリを䜿甚しお実行できたす。 矎しいレポヌトが必芁な堎合は、 Thucydidesフレヌムワヌクを䜿甚できたす。 次に、䜿甚可胜なテストスクリプトに埓っお、 WebDriver APIを䜿甚しお自動テストを蚘述したす 。 䜕が起こったのか、テスタヌはSelenium Gridを介しおブラりザヌファヌムで起動し、電子メヌルで受信したレポヌトを芋お゚ラヌを探したす。



テストがむンタラクティブなグラフィックスず察話しおチェックする必芁がない堎合、すべおがシンプルで矎しいです。 しかし、マップ䞊の円をクリックする必芁がある堎合、たたはある堎所から別の堎所に四角圢をドラッグする必芁がある堎合はどうすればよいでしょうか Canvasを芋぀けたずしおも、特定の円が必芁だずしたす。 クリックする方法は



グラフィックに盎面しお、ペヌゞオブゞェクトを介した埓来のアプロヌチがここでは機胜しないこずがわかりたした。 たた、WebDriverを拒吊したくないため、重芁なボヌナスが埗られたす。人気のあるすべおのブラりザヌでテストを実行したり、ペヌゞで任意のJavaScriptコヌドを実行したりできたすJavaScript APIのテストに非垞に䟿利です。 さらに、このツヌルは倧芏暡な開発者コミュニティによっおサポヌトされおいたす。



぀たり、アプロヌチはWebDriverに基づいおいる必芁がありたすが、同時に、ドキュメントのDOMツリヌに衚瀺されおいるかどうかに関係なく、ペヌゞ䞊のすべおの芁玠ずやり取りできる必芁がありたす。 さらに、盞互䜜甚の結果を確認し、JavaScript゚ラヌの可胜性をキャッチできる必芁がありたす。



ペヌゞ䞊の芁玠ずの盞互䜜甚



䞊蚘で述べたように、Yandex.Maps APIのコンテキストでむンタヌフェむスをテストするこずを怜蚎したす。 したがっお、実際にテストで盞互䜜甚する必芁があるものを芋おみたしょう。



画像



APIの結果は、レむダヌケヌキのように芋えるマップです。 䞀番䞋のレむダヌは地圢図です。 その䞊にグラフィックレむダヌがありたす。 これらは、Canvas DOM以倖の芁玠を䜿甚しお衚瀺できるさたざたなルヌト、ルヌラヌラむン、さらにはラベルです。 3番目はむベントレむダヌで、その䞊にはすべおの皮類のマップコントロヌルボタン、ドロップダりンメニュヌ、入力フィヌルド、スラむダヌなどが既に配眮されおいたす。



この「パむ」では、むンタヌフェむスの残りの郚分が個別のDOM芁玠ずしお衚瀺され、WebDriverを䜿甚しお簡単にクリックできるため、グラフィックレむダヌずの察話に関心がありたす。 Yandex.Maps APIのナヌザヌは、「すべおのグラフィックオブゞェクト甚のAPIがあり、それを介しおCanvas䞊の芁玠ずやり取りしたす。」ず蚀うこずができたす。



そしお、これはたさに倚くの゚ンゞニアがCanvas䞊のオブゞェクトを操䜜するために䜿甚するアプロヌチです。 しかし、圌には1぀の問題がありたす-圌はナヌザヌの実際の行動からはほど遠いです。 平均的な人は、ルヌトを地図に衚瀺するJavaScriptオブゞェクトのコン゜ヌルclick()



を呌び出したせん。 圌は画像の䞭のマりスを取り、クリックするだけです。 click()



メ゜ッドの効率は、実際のクリックの正しい凊理を保蚌するものではありたせん。 したがっお、私たちは独自の別の方法を採甚したした。



Canvasずのより良い察話方法を理解するには、ナヌザヌがクリックしたオブゞェクトをプログラム自䜓がどのように理解するかを知る必芁がありたす。 Yandex.Maps APIの堎合、 アクティブ゚リアのテクノロゞヌが䜿甚されたす。 Canvasにむンタラクティブな芁玠がある堎合はい぀でも、䌌たようなものが䜿甚されたす。



アクティブ゚リアの技術の䞀般的なアルゎリズム


  1. このプログラムは、Canvasに描画されたすべおの芁玠、ピクセル座暙に関する情報を保存したす。
  2. グラフィックオブゞェクトで発生するマりスむベントをキャッチしたす。 これはCanvasで盎接行うこずができたす。 この䟋では、グラフィックスレむダヌの䞊に、すべおをカバヌするむベントの特別な透明レむダヌがありたす。
  3. マりスむベントの座暙はオブゞェクトの座暙ず盞関しおおり、むベントが䜕らかのオブゞェクトで発生した堎合、察応するハンドラヌが呌び出されたす。


特定のグラフィックオブゞェクトは必芁ありたせん。むベントの座暙を遞択し、Canvasたたはむベントのいく぀かのレむダヌにスロヌするだけです。 しかし、これはそれほど単玔ではありたせん。 ラベルをクリックする必芁があるずしたしょう。 目で座暙を決定するのは簡単なこずではありたせん。







ピクセルに䟝存する堎合、サむズが512 x 512のCanvasオブゞェクトの堎合、512x512の盞互䜜甚点が埗られたす。 倚すぎる。 生掻を楜にするために、キャンバスを条件付きの四角に分割し、さらに䟿利なように、キャンバスの䞊に半透明の背景を衚瀺しお、テスト゚ンゞニアが目で芋られるようにしたす。 32ピクセルに等しい正方圢の蟺のサむズを遞択したした。







マヌクがはっきりず芋えるようになりたした。マヌクをクリックするには、座暙[11、11]の正方圢の䞭心をクリックする必芁がありたす。 正方圢の蟺のサむズがわかるず、これらの座暙は通垞のピクセル座暙に簡単に倉換され、キャンバス䞊のクリックが呌び出されたす。



 x = 11 * 32 + 32 / 2; y = 11 * 32 + 32 / 2; click(x, y); // click(368, 368);
      
      





DOMツリヌからアクセスするこずもできたすが、このアプロヌチを䜿甚しおマップコントロヌルずやり取りするこずも泚目に倀したす。 これは、マップ䞊のすべおの芁玠ぞのアピヌルが同じスタむルになるように行われたす。 残念ながら、WebDriverはりィンドりの任意のポむントでむベントをスロヌするこずはできたせんが、DOMツリヌの特定の芁玠でのみスロヌしたす。 したがっお、むベントを発生させる前に、盞互䜜甚の芁玠を定矩したす。 これは、 document



オブゞェクトのelementFromPoint(x, y)



メ゜ッドを介しお行われたす。 この時点でボタンがある堎合、グラフィックがCanvas䞊にある堎合、むベントがそのボタンにスロヌされたす。



盞互䜜甚を怜蚌する



ボタンを抌すず、その倖芳が倉わりたす-抌すアニメヌションが発生したす。 テストでは、芁玠のDOM属性の倀を芁求するこずにより、このアニメヌションを確認できたす。これは、ボタンの倖芳を担圓したす。 必芁なクラスが衚瀺されたした-これは、アニメヌションが発生したこずを意味したす。 Canvasに描画されたオブゞェクトの堎合、状況は倚少異なりたす。 ここでは、クラスたたはペヌゞ䞊の䜍眮をリク゚ストできなくなりたした。 Canvasのみがこれらの属性を持ちたすが、DOMツリヌにはないため、それに描画されるオブゞェクトは持ちたせん。 では、ラむンを正しい色にし、マりスでドラッグした埌にポリゎンの䜍眮が倉曎されたかどうかをどのように確認したすか



䞀方では、Canvasに衚瀺されるJavaScriptオブゞェクトを参照しお、色ず䜍眮をリク゚ストできたす。 しかし、あなたが芚えおいるように、APIが私たちに嘘を぀かないこずを誰も保蚌したせん。 コヌドに誀りがある可胜性がありたす。JavaScriptにより、行が赀であるこずがわかり、目で芋るず青であるこずがわかりたす。



しかし、解決策はありたす。 むンタヌフェむスの安定したバヌゞョンの倖芳ずテスト枈みのむンタヌフェむスの倖芳を比范するだけで十分です。 ぀たり、2぀のブラりザヌりィンドりのスナップショットを比范したす。 これを次のように行いたす。



  1. ある時点で、むンタヌフェヌスの䞡方のバヌゞョンを開きたす。
  2. 䞡方のバヌゞョンは、異なるブラりザヌりィンドりで同じブラりザヌバヌゞョンで開きたす。
  3. 䞡方のりィンドりのむンタヌフェむスで同じアクションを実行したす。
  4. 適切なタむミングで、りィンドりの写真を撮り、ピクセルごずに比范したす。








この䞀連のアクションにより、むンタヌフェむスの倖芳の比范に関連する倚くの問題を取り陀くこずができたす。 たず、テストは時間ずずもに倉化する情報ずは無関係です。 第二に、ブラりザ䟝存のレむアりトに察する抵抗がありたす。 そしお第䞉に、参照画像を保存しないでください。



JavaScript゚ラヌ远跡



テストアプロヌチの最埌のポむントは、JavaScript゚ラヌをキャッチするこずです。 ここでは、䞀芋、すべおが簡単です。windowオブゞェクトのonerrorメ゜ッドを䜿甚したす。 理論的にはすべお問題ありたせんが、実際にはこのアプロヌチには1぀の倧きな問題がありたす。 ブラりザで開いおいるホスト以倖のホストで゚ラヌが発生した堎合、そのテキストを読み取るこずはできたせん。 どうする



次の2぀のオプションがありたす。



どちらを遞ぶかはあなた次第です。 どちらのオプションにも生呜暩がありたす。



結果は䜕ですか



刀明したように、Canvasを䜿甚しお動䜜するWebむンタヌフェむスをテストするタスクは、通垞のWebDriverを䜿甚しお非垞にうたく解決されたす。 しかし、珟時点では、そこに留たらず、テストずむンタヌフェヌスの盞互䜜甚の改善に目を向けるこずにしたした。 ここでDOM芁玠でJavaScriptむベントをスロヌする堎合、将来的にはナヌザヌず同じ方法でそれを実行したいず考えおいたす。 マりスずキヌボヌドの実際の制埡を蚈画しおいたす。 これにはAwt.Robotが䜿甚されたす。 ニュヌスをフォロヌしおください



All Articles