カオスずグレムリンWeb UIテスト

りェブ開発の䞖界には未定のルヌルがありたす。ナヌザヌの行動を予枬するこずはほずんど䞍可胜です。 これは、誰かが新しいWebサむトたたはWebアプリケヌションで䜜業を開始するのを芋た人なら誰でも確認できたす。 たずえば、そのようなものを芋た回数さえ芚えおいたせん。 たずえば、人々は単に携垯電話でブラりザを䜿甚する方法を単に忘れおいるず考えられるこずがありたす。 時々圌らの行動は非垞に非論理的であるため、実際のりェブサむトで働いおいる実圚の人物ではないように芋えたすが、䞍条理な挔劇のゞャンルでの挔劇です。 。







ここでのポむントは、開発者がプロ​​グラムで䜜業しおいるずきに、ナヌザヌの行動をい぀でも正確に予枬できないこずです。 人が䜕かに非垞に興奮しおいるずしたしょう。その結果、圌は䜕かをあたりにも早くしようずしたす。 圌がフィヌルドにデヌタを入力し、ボタンをクリックする方法は、冷静で集䞭的な行動ずはたったく異なりたす。 残念ながら、゜フトりェア補品を蚭蚈および開発する堎合、そのような「完璧なオプション」によっお正確に導かれるこずが倚く、「理想」から遠く離れた他のケヌスで䜕が起こるかに぀いお考えおいたせん。



開発者は、ナヌザヌが内郚ロゞックを理解するこずを期埅しお、゜フトりェアシステムの䜜成に努めおいたす。 圌らは、ナヌザヌを合理的であるず芋なしたす。たずえば、電話画面䞊のすべおにランダムに觊れるず、非垞に予枬䞍可胜な䜕かに぀ながる可胜性があるこずを知っおいたす。 ちなみに、奇劙なこずは、完党に普通の人が偶然に、おそらくコンピュヌタヌの画面や電話を芋なくおも、䜕かをクリックしたり、䜕かに觊れたりしおも可胜です。 たずえば、倖出䞭に電話で話しおいる間、ツむヌトやメヌルに同時に答えようずしたこずを自分で䜕回行ったか思い出せたすか



予枬䞍可胜なむベントに察するコンピュヌタヌシステムの反応を調査できるツヌルは昚日登堎したせんでしたが、歎史を深く掘り䞋げるこずはしたせん。 2012幎にNetflixが内郚サヌビスChaos Monkeyのコヌドを開いたずきのWeb開発者に近い䟋を考えおみたしょう。 このシステムは、「実皌働環境内で実行される仮想マシンずコンテナヌをシャットダりンしたす。」 通垞の蚀語では、Chaos Monkeyはサヌバヌをランダムに切断しお、そのような堎合のシステムの動䜜を調べ、耇数のマシンの障害の結果ずしおサヌビス党䜓がクラッシュしないようにしたす。



アプリケヌションを蚭蚈するずき、「理想的なオプション」のためにそれらを準備するだけに制限すべきではないこずは誰もが知っおいたす。 しかし、この問題をWebむンタヌフェヌスの開発面に倉換するず、かなり合理的な疑問が生じたす。「プログラムの仮想ナヌザヌの予枬䞍可胜な匱点ず砎壊的な䞀連の行動を芋぀ける方法は サヌバヌで同様のこずが行われた堎合、むンタヌフェむスで同じこずを行うこずは可胜ですか」



この質問に答える前に、無限の猿に関する定理を思い出したす。「タむプラむタヌのキヌを絶察にランダムに抌すこずにより、仮想の猿は遅かれ早かれシェヌクスピアの劇のいずれかを印刷したす。」 もしそうなら、それが䜕であれ、たった1匹の猿がりェブむンタヌフェヌスでバグや問題を芋぀けるこずができたす。



スタゞオのサル



「モンキヌテスト」サルテスト、たたは「カオステスト」ずも呌ばれる、システムを䜿甚するための実際のシナリオずはたったく関係のないランダムなナヌザヌアクションのシミュレヌションに基づいお゜フトりェア補品をテストする方法論です。



りェブサむトのモバむルバヌゞョンのテストに぀いお話す堎合、フィヌルドぞのボタンのランダムタッチ、タッチスクリヌン䞊のさたざたなゞェスチャヌがありたす。 このようなテストの目的は、アプリケヌションの問題を芋぀けるか、パフォヌマンスを完党に砎壊するこずです。 これは、特定のシヌケンスで特定の条件䞋で発生する䞀連のアクションを含むテストスクリプトを蚘述する通垞の単䜓テストや受け入れテストずはたったく異なりたす。 その結果、たずえばむンタヌフェヌスの領域でのこのようなテストは、開発者が正しい操䜜をどのように芋おいるかに匷く䟝存したす。



プログラマヌは、モンキヌテストの実行方法をあたり制埡できたせん。たた、モンキヌテストを実行するたびにアプリケヌションが新しいランダムなテストセットに公開されるため、テストは1぀のシナリオに限定されず、ナヌザヌずプログラムの盞互䜜甚の予枬䞍可胜なシナリオの無限のセットを衚したす。



このタむプのテストは、さたざたなアプリケヌションを実行するほずんどのプラットフォヌムで利甚できたすが、猿のテストがWeb環境で広たったずは蚀えたせん。 たずえば、Android SDKには組み蟌みのUI Exerciser Monkeyツヌルがあり、ほずんどのむンタヌフェむスむベントずシステムむベントを䜿甚しおアプリケヌションをテストできたす。 Androidを芋るず、このような暙準機胜を、たずえば人気のあるブラりザヌの「開発者ツヌル」セクションで芋぀けたいず思うのは圓然ですが、ただ「猿」はありたせん。 この状況はMarmelabチヌムによっお修正され、WebむンタヌフェむスGremlins.jsのランダムテスト甚のJavaScriptラむブラリが䜜成されたした。



グレムリンが来たす



すべおは、 Gremlins.jsを開発するずきに、ラむブラリの䜜成者が2぀のコメディホラヌ映画 Joe Danteに觊発されたこずを瀺しおいたす。 ラむブラリ内の「グレムリン」は、蚭蚈が䞍十分なペヌゞで地獄の混乱を匕き起こす可胜性がある関数です。 図曞通の「墓」は平和的な存圚であり、その䞻な仕事は、䜕が起こっおいるのかを芳察し、芋たものを報告し、詊隓プロセスを支揎するこずです。 ギズモもありたす。 ラむブラリでは、テストセッションを停止するメカニズムの圹割を果たしたす。



暙準のランダムテスト手順を実行しおラむブラリを䜿甚するには、数行のコヌドたたはマりスを数回クリックするだけで十分です。 同時に、必芁に応じお、テストを非垞に现かく調敎できたす。 開始するには、次の3぀の方法のいずれかを遞択できたす。Gremlins.jsをスタンドアロンラむブラリずしおペヌゞに接続する、Require.jsモゞュヌルずしお接続する、ブックマヌクレットから開始する。 これらの方法を怜蚎しおください。



▍自埋ラむブラリ



テスト環境を䜜成する最も簡単な方法は、䜓隓したいWebペヌゞにラむブラリを盎接含めるこずです。 このアプロヌチのおかげで、 gremlins



はグロヌバル名前空間にgremlins



れ、ラむブラリはどこからでも呌び出すこずができたす。 次のようになりたす。



 <script src="path/to/gremlins.min.js"></script> <script type="javascript"> //      ! gremlins.createHorde().unleash(); </script>
      
      





▍モゞュヌルRequire.js



プロゞェクトでRequire.jsを䜿甚しおいる堎合、Gremlins.jsをグロヌバルな名前空間に圱響を䞎えるこずなく適切な堎所にむンポヌトできたす。



 require.config({ paths: {   gremlins: 'scripts/libraries/gremlins.min' } }); require(['gremlins'], function(gremlins) { gremlins.createHorde().unleash(); });
      
      





bookmarkブックマヌクレットの䜿甚



ラむブラリをプロゞェクトに統合したくない堎合は、ずきどきテストのパスを遞択したす。ブックマヌクレットを䜿甚するず、ブラりザヌで開いおいるペヌゞを䜓隓できたす。 公匏ドキュメントからのリンクは、ブックマヌクレットをブックマヌクバヌに远加できる堎所です。



実隓



ラむブラリを䜿甚するオプションを遞択した堎合は、ペヌゞに含めるか、Require.jsを䜿甚しおむンポヌトするこずができたす。コヌドでグレムリンの実隓を開始できたす。 この䟋では、gremlins.createHorde。Unleashの呌び出しを瀺しおいたす。 䜕が起こるかを考えおみたしょう。



 gremlins                 // , ! .createHorde()   //      .unleash();          //     .
      
      







Gremlins.jsは、「gremlins」の5぀の「品皮」ラむブラリヌ甚語の皮-ナヌザヌがペヌゞず察話するためのさたざたなオプションを実装する関数を提䟛したす。 デフォルト蚭定の暙準「矀れ」倧矀には、5皮類すべおが含たれたす。 ぀たり、これらは次のずおりです。





ペヌゞ䞊でさたざたなアクションを実行するグ​​レムリンず呌ばれ、画面䞊に目に芋える痕跡を残したす。 さらに、それらのアクションは、特定の皮類のグレムリンに関連する远加デヌタずずもに、ブラりザヌのJavaScriptコン゜ヌルに蚘録されたす。 これらの゚ントリは次のようになりたす。



 gremlin formFiller input 5 in <input type="number" name="age"> gremlin formFiller input pzdoyzshh0k9@o8cpskdb73nmi.r7r in <input type="email" name="email"> gremlin clicker    click at 1219 301 gremlin scroller   scroll to 100 25
      
      





デフォルトでは、グレムリンは10ミリ秒の間隔で1000回ランダムに呌び出されたす。



既に述べたように、Gremlins.jsにはグレムリンだけでなく、グレムリンがありたす。グレムリンは、䞍良ペヌゞを现かく匕き裂くこずができたす。 平和な墓もありたす。





たずえば、FPSが10を䞋回るず、フレヌムレヌトを監芖しおいるモヌファが゚ラヌを報告する堎合がありたす。次のようになりたす。



 mogwai  fps  12.67 mogwai  fps  23.56 err > mogwai  fps  7.54 < err mogwai  fps  15.76
      
      





䜕が起こっおいるかを蚘録し、グレムリンを芖芚化するこずにより、テスト結果を分析し、必芁に応じお゚ラヌを修正するための察策を講じるこずができたす。



実際、蚭定がなくおも、Gremlins.jsは非垞にたずもな䞀連のテストを実装しおいたす。



高床な実隓



暙準構成でテストを䜿甚した埌、目的を達成できなかった堎合、テストを構成するのに十分な数の方法がありたす。 たずえば、おそらく、各テストセッションで、ペヌゞ党䜓を垞にテストするのではなく、ペヌゞの特定のコンポヌネントのみに努力を集䞭させたいず思うでしょう。



すべおのタむプのグレムリンをカスタマむズするこずはできたせんが、 toucherGremlin



、 clickerGremlin



およびformFillerGremlin



ペヌゞの特定の領域のみに制限できたす。 特に、蚭定時に、タヌゲットにする芁玠の芪を芋るためのグレムリンを提䟛したす。 この芁玠が関心のあるオブゞェクトのリストに含たれおいる堎合、グレムリンはビゞネスを開始したす。 そうでなければ、圌は盞互䜜甚する芁玠を芋぀けようずしたす。 maxXbTries



パラメヌタヌを蚭定するこずにより、適切な芁玠を芋぀けるための最倧詊行回数を蚭定するこずもできたす。



 gremlins.species.clicker().canClick(function(element) {   return $(element).parents('.my-component').length;   /**   ,        ,    ?   –  true     .   –     ,  false.   **/ }).maxNbTries(5); //    5     //     toucherGremlin  formFillerGremlin gremlins.species.formFiller.canFillElement(/**   **/); gremlins.species.toucher.canTouch(/**   **/);
      
      







グレムリンの遞択



ラむブラリの暙準機胜が䞍足しおいる堎合、特に既存のグレムリンに満足できない堎合、これは簡単に修正できたす。 独自のグレムリンを持ち出し、プロゞェクトのナヌザヌに期埅するすべおを実行するように教えるこずができたす。



たずえば、誰かがその芁玠を操䜜しおいるずきに、い぀でもランダムにフォヌムを送信しようずするずどうなるかを確認する必芁がありたす。 い぀かclickerGremlin



が送信ボタンをクリックするこずを期埅できたすが、最良の方法は、フォヌムの送信専甚のグレムリンを䜜成するこずです。 これにより、この操䜜を実行する可胜性が高たり、実行方法を制埡できたす。



新しい皮類のグレムリンを開発するには、JavaScriptでDOMむベントを䜜成および構成する方法を少し理解する必芁がありたす。 それでは、フォヌムを送信するグレムリンを䜜成するプロセスを芋おみたしょう。



 gremlins.createHorde() //    .allGremlins()      //    .gremlin(function() {   //    ,       var targetElement, availableForms;   availableForms = document.querySelectorAll('form'); //         targetElement = availableForms[Math.floor(Math.random()*availableForms.length)]; //           //        var evt = document.createEvent('HTMLEvents');  //      evt.initEvent('submit');  //        targetElement.dispatchEvent(evt);  //         //  ,     ,          console.log('gremlin submit ', targetElement); }) .unleash();
      
      







カスタムむベントの䜜成の詳现に぀いおは、Mozillaのドキュメントをご芧ください。 さらに、ラむブラリ内でむベントがどのように䜜成されるかを理解するには、ラむブラリの゜ヌスコヌドを調べる䟡倀がありたす。 たずえば、 clickerGremlinで開始できたす。



実際、このラむブラリは、新しいタむプのグレムリンを䜜成するよりも倚くのカスタマむズおよび拡匵方法をサポヌトしおいたす。 たずえば、新しい墓の远加、テストスクリプトの遞択、テストの前埌のコヌドの実行などです。 最埌に、さらに必芁に応じお、Gremlins.jsに基づいお独自のプロゞェクトを䜜成できたす。これは、むンタヌフェむスをテストするためのJSラむブラリを衚瀺する方法ずたったく同じです。



非ランダムテストケヌスの遞択



ランダムに遞択されたテストスクリプト、各テストの実行埌に衚瀺される新しいグレムリンの矀れ、およびペヌゞをランダムにテストするこずは、バグを芋぀けるのに最適な方法です。 ただし、゚ラヌが芋぀かり、それを解決するために䜜業した堎合、どうすればそれが本圓に修正されたこずを確認できたすか このような状況では、それを匕き起こしたテストを繰り返し、システムの新しい反応を芋぀ける方法があるず䟿利です。 そのような堎合のために、同じテストシナリオを数回繰り返す必芁がある堎合、乱数ゞェネレヌタヌの初期化のバリ゚ヌションがあり、それに基づいおパックの動䜜がモデル化されたす。 これは、 seed()



関数を䜿甚しお行われたす。



 var horde = gremlins.createHorde(); horde.seed(1234); horde.unleash();
      
      





ここで、Gremlins.jsを䜿甚しお実装されたモンキヌテストの䞻な䟡倀は、その予枬䞍胜性であるこずに泚意したいず思いたす。 したがっお、同じシナリオを繰り返すこずは有甚ですが、そのようなテストのみを䜿甚するず、混chaずしたテストの意味が疑問芖されたす。



結論



ナヌザヌに぀いおの仮定を立おるこずは、Webプロゞェクトの蚭蚈ず開発に基づいお、信じられないほどの数の特別なケヌスを考慮するこずを拒吊するこずを意味したす。 ナヌザヌは、最新のデバむスではなく、䜎速の通信チャネルを持぀こずができたすが、特定の人が䜕であり、どのようになり埗るかは決しおわかりたせん。 奜奇心five盛な5歳くらいの子䟛が芪の携垯電話に届かず、タッチスクリヌン䞊のすべおを熱心に突っ぀いたりしないこずを保蚌するこずは䞍可胜です。 これがもたらすこずは倧きな疑問です。 マヌケティング郚門の誰かが新しいサむトを最初に芋たずきにあたり喜んでいないこずを事前に知るこずはできたせん。 順序も速床も再珟性も予枬できたせん。 開発者ずしお、ナヌザヌが正しい動䜜の厳密に定矩されたモデルを期埅しおいるずいう理由だけで、理由もなくサヌビスがクラッシュしないように、ナヌザヌがそれを可胜にする矩務がありたす。



クラむアント偎のモンキヌテストツヌルは小さいですが、Gremlins.js開発者はその芁点を把握するこずができたした。 そしお、私たち䞀人䞀人がこのラむブラリの改善に貢献できたす。 Gremlins.jsの䜜成者のチヌムは、どんな助けも喜んでしたす。 グレムリンずモヌワが他に䜕ができるかに぀いお䜕か考えがあれば教えおください。



All Articles