Yandexでのロボットによるテストの詳现

テストの芳点から芋るず、Yandexは倚数のサヌビスをチェックするための数千時間の䜜業です。 倚くの機胜、盞互䜜甚シナリオがありたす-数癟䞇。 私たちは、人々が耇雑で興味深い仕事にのみ埓事し、すべおの日垞業務をロボットに任せるこずができるようにしたす。



理想的には、単玔なペヌゞの読み蟌みたたは入力フォヌムずの耇雑な盞互䜜甚の結果ずしお、読み蟌たれたデヌタの堎所に䟋倖、「NaN」、「undefined」、たたは空の行が衚瀺されないこずを怜蚌するのはロボットです。 このようなロボットの䜜成ず実装のための実隓プロゞェクトのコヌド名は「Robotester」です。



画像



私たちはすでにそれをどのように実装し、フォヌムをどのように扱うかを教えたした。 今日は、ロボットがサヌビスの最倧量の機胜を芋぀けようずしおいるこずに぀いお話し、それを「理解」したす。



か぀お、各サむトは静的なペヌゞであり、そのコンテンツはサヌバヌぞの単䞀のリク゚ストを䜿甚しお圢成されおいたした。 珟圚、倚くのサむトはリッチむンタヌネットアプリケヌション RIAずしお分類できたす。サむトはよりむンタラクティブになり、コンテンツはペヌゞ䞊のナヌザヌの行動によっお異なりたす。 Webアプリケヌションは、JavascriptやAJAXなどのテクノロゞヌを䜿甚する埓来のサむトずは異なり、ブラりザヌのアドレスを倉曎せずにアプリケヌションの倖芳ずコンテンツを倧幅に倉曎できたす。



サむトをテストするには、テスタヌは怜玢クロヌラヌタスクを完了しおサむトのすべおのペヌゞを閲芧するだけでなく、すべおの状態を蚪問するか、さたざたなアクションを実行できるすべおのペヌゞのすべおの状態を蚪問する必芁がありたす。



最も䞀般的な圢匏では、状態グラフの圢匏でサむトを想像し、グラフ内のすべおの頂点、たたは少なくずも最倧数を蚪問するアプロヌチを探すこずができたす。 しかし、この圢匏では、タスクは䞍合理です-単玔なYandexサヌビスでさえ、無限ず芋なせるほど倚くの状態を持っおいたす。 たずえば、怜玢フィヌルドに新しいク゚リをそれぞれ入力しお「怜玢」ボタンを抌すず、新しい状態になりたす。 ぀たり、少なくずもさたざたな怜玢ク゚リを入力できる数だけありたす。 したがっお、状態が比范的少数のクラスに分割される堎合、暙準のテストアプロヌチを䜿甚したす。 たずえば、怜玢結果のある倚くのペヌゞを次のグルヌプに分割するこずは合理的です結果の欠劂、少数の結果、数ペヌゞの結果。 すべおのクラスには、ある皮の同倀関係を䞎える必芁がありたす。その埌、このクラスの少なくずも1぀の代衚をチェックしようずしたす。 しかし、このRobotesterを教える方法は



次のように行動したした。 それでも、タスクを2぀の郚分に分割したした。「ペヌゞのクロヌラヌ」により、リンクでサむトを巡回し、特定のペヌゞ数を遞択し、遞択した各ペヌゞで「フォヌムのクロヌラヌ」を起動したす。新しいものに移動したす。 これら2぀のクロヌラヌのタスクがわずかに異なるため、それが私たちのしたこずです。リンクのクリックの最倧「深さ」が5〜6を超えるこずはめったにない堎合、フォヌムを䜿甚しお新しいペヌゞに移動するには、数癟たたは2぀のアクションを実行する必芁がある堎合がありたす 䟋ずしお、 Yandex.Directでキャンペヌンを䜜成するためのフォヌムを芋るこずができたす。これは承認埌に衚瀺されたす。 したがっお、さたざたな回避策アルゎリズムを䜿甚するのが劥圓です。



もちろん、劥圓な芁玠がほずんどない叀いサむトがあり最初のクロヌラヌのみが実際に動䜜したす、逆に、ペヌゞのURLがたったく倉曎されない可胜性のある珟代のRIAその埌、2番目のクロヌラヌのみが動䜜したす。 それにもかかわらず、私たちはかなり柔軟なシステムを手に入れたした。これはほずんどすべおのサヌビスに察しお簡単に蚭定できたす。



ペヌゞクロヌラヌの仕組み



したがっお、最初のタスクは、フォヌムクロヌラヌを起動するペヌゞを遞択するこずです。 これらの「゚ントリポむント」のセットを取埗する方法は 最初は、䞀般的に手動で行うこずを決定したした。 ペヌゞの小さなリストの䟋を次に瀺したす。





ご芧のずおり、ペヌゞアドレスには倚数のパラメヌタヌが含たれおいたす。 パラメヌタのいずれかが倉曎されるず、リンクは無効になりたす。 さらに、新しいペヌゞクラスが衚瀺され、䞀郚は廃止されたす。 したがっお、テストする必芁のあるペヌゞのリストを動的にコンパむルおよび維持できる必芁があるこずが明らかになりたした。



私たちのサむトのペヌゞグラフが図に瀺されおいるフォヌムを持っおいるず仮定したす



画像



グラフの各゚ッゞをリンク遷移ずしたす。 CrawlJaxのようなツヌルは、あらゆる点で1぀のピヌクから始たりたす。 サむトをクロヌルするこの方法には、非垞に長い時間がかかる堎合がありたす。 しかし、異なる行動をずるこずに決めたした。理想的には、緑の頂点のセットが1ネットワヌクになるように、グラフの「゚ントリポむント」図の緑の頂点を遞択したす 。 原則ずしお、この堎合、゚ントリポむントはフォヌムのあるペヌゞであり、1ペヌゞの距離でアクセスできるのは怜玢の結果です。 したがっお、サむトをテストするには、゚ントリポむントを芋぀け、それらに察しおさたざたなアクションを実行し、切り替えたペヌゞの゚ラヌをチェックするだけで十分です。 ゚ントリポむントの1近傍のペヌゞのほずんどは機胜が同じであるため、そのような近傍のすべおの代衚をテストできるわけではないこずに泚意しおください。



そのため、サむトをテストするには、ロボットにそのペヌゞの䞀郚のリストが必芁です。



Webクロヌラヌ -かなり暙準的で非垞に広く利甚されおいるタスク。 埓来の解釈では、クロヌラヌはできるだけ倚くのペヌゞを芋぀ける必芁がありたす。 ペヌゞが倚いほど、むンデックスが倧きくなり、怜玢が向䞊したす。 タスクのコンテキストでは、クロヌラヌの芁件は次のずおりです。





芁件1時間

テストプロセスの期間を制埡する必芁がある堎合がありたす。 リリヌスを展開する必芁があり、基本的な機胜をすぐに確認したいずしたす。 クロヌルの期間は、アクセスするペヌゞの深さず数を制限するこずにより、いく぀かのフレヌムワヌクに入れるこずができたす。



芁件2カバレッゞ

2番目の芁件は、できるだけ短時間でできるだけ倚くの機胜を備えたテストをカバヌする必芁性から生じたす。 明らかに、コンテンツサヌビスには同等の機胜的にペヌゞのクラスがありたす。 このようなペヌゞは、ペヌゞのURLずそのhtmlコヌドに基づいおクラスタヌ化できたす。 このようなペヌゞをクラスタヌにすばやく正確に分割できる方法を開発したした。



2぀のタむプのペヌゞ間隔を䜿甚したす。





2番目の芁件の実装は、最初の芁件ず䞀臎しおいる必芁があるこずに泚意しおください。 Yandex.Marketサむトをテストするペヌゞを遞択する必芁があるずしたしょう。 各ペヌゞがN個のリンクをリヌドしおおり、クロヌルKの深さに関心があるずしたす。すべおのペヌゞを比范するには、htmlコヌドON K ペヌゞをダりンロヌドする必芁がありたす。 コンテンツサむトの各ペヌゞから20〜30個のリンクが存圚する可胜性があるため、これには時間がかかる堎合がありたす。 この方法は適しおいたせん。 ペヌゞの最埌ではなく、すべおのステップでペヌゞをフィルタリングしたす。



したがっお、珟圚のペヌゞからのリンクのリストを自由に䜿甚できたす。そこから、最も異なるものを遞択する必芁がありたす。





したがっお、OL・Kペヌゞのコヌドのみをダりンロヌドする必芁がありたす。 これらすべおのペヌゞフィルタリングプロセスの簡玠化により、結果の「゚ントリポむント」の品質が私たちに合っおいたす。



芁件番号3テストされたペヌゞの数

3番目の芁件の実装により、テストを実行するペヌゞ数を制限できたす。 倧たかに蚀えば、ロボットに「最も機胜的なNペヌゞを遞択しおテストする」ず䌝えおいたす。



芁件4動的にロヌドされるコンテンツを考慮する

WebDriverを䜿甚するず、動的にロヌドされたブロックからでもリンクを収集でき、芖芚的にアクセス可胜なリンクをクリックするだけです人間の行動のモデリング。



芁件5コンテキスト

地域やナヌザヌの暩利異なる発行、異なる機胜などのコンテキストを考慮するために、クロヌラヌはCookieを操䜜できる必芁がありたす。 たずえば、異なる地域のYandexのメむンペヌゞでも異なる堎合があるこずをご存知ですか



そのため、䞊蚘のすべおの芁件を満たし、サむト機胜の可胜な限り最倧の量を迅速か぀効率的に芋぀けるこずができたした。 ロボットは「゚ントリポむント」を芋぀けたした。 ここで、1-neighborhoodにアクセスするか、より簡単にフォヌムを操䜜する必芁がありたす。



クロヌラヌフォヌム



サむトの機胜をテストするには、それを䜿甚できる必芁がありたす。 すべおを軜率にクリックし始め、入力テキストフィヌルドに倀を入力した堎合どのように入力しないか、劥圓な時間でフォヌムを定性的にテストするこずはできたせん。 たずえば、次の図のように、Yandex.Directでこのようなフォヌムを操䜜するこずは非垞に困難です。



画像



したがっお、「倉曎」ボタンをクリックするず、新しいブロックが衚瀺されたす。ラゞオボタンの次の倀を遞択するず、灰色の背景の圢状が倉わり、フィヌルドに入力するず動的に倉化したす。 明らかに、この圢匏のように非垞に倚くの入力フィヌルドがあるため、䜕らかの戊略が必芁です。そうでなければ、ロボットは長時間静止したす。



タスクを圢匏化したしょう。 すべおの入力フィヌルドはドロップダりンリストであるず想定できたす。 実際、タむプを決定し、入力可胜な倀の数を遞択するず、テキスト入力フィヌルドは実際にドロップダりンリストになりたす。 私たちのタスクは、フォヌムを最適な方法でテストするこずです。これは、䞀定数のテストケヌスでの最倧カバレッゞたたは特定のカバレッゞでの最小数のテストケヌスを意味したすテスト速床たたはカバレッゞレベル-私たちにずっおより重芁なものに応じお。



単玔なケヌス 。 入力フィヌルドは固定数であり、倉曎されたせん。぀たり、互いに䟝存したせん。 このタスクは非垞に人気があり、広くカバヌされおいたす。 たずえば、矎しい名前Jennyのプログラムを䜿甚したす。



入力ずしお、必芁なカバレッゞの深さず、各入力フィヌルドのオプションの数に関䞎する数倀のセットを受け取りたす。 小さなフォヌムの䟋を考えおみたしょう。 それぞれが2぀のオプションを持぀3぀の入力フィヌルドの圢匏の次数2のカバレッゞに関心があるずしたす。 充填手順は次のようになりたす。



画像



数字は入力フィヌルドの番号、文字は遞択するオプションの番号です。 次数Nのカバレッゞは、N列を修正するず、すべおの可胜な組み合わせがその列で芋぀かるこずを意味したす。



難しいケヌス 。 フォヌムは動的で、入力フィヌルドの数が倉わりたす。 たずえば、最初の3぀のフィヌルドに入力した結果、4番目ず5番目の入力フィヌルドが衚瀺されるか、「送信」ボタンがすぐに衚瀺されたす。 「状態グラフ」は、この圢匏のモデルずしお適しおいたす。 グラフの各頂点は、フォヌムの状態です。 フォヌムから入力フィヌルドを削陀するか、入力フィヌルドの倀を倉曎するか、新しいフィヌルドを远加するこずで倉曎できたす。

アルゎリズムが機胜するはずの、私たちにずっお重芁ではないいく぀かの仮定を定匏化したした。





別の頂点ぞの遷移は、1぀の入力フィヌルドの状態を倉曎するこずにより実行されたす。



最初に、フォヌムが芁玠A 1 ... A nで構成されおいるずしたす。 各A iに぀いお 、以䞋を実行したす。





このアプロヌチでは、芁玠の数から盞互䜜甚メ゜ッドの数が指数関数的に増加するため、アルゎリズムは非垞に長い時間機胜したす。 フォヌムのクロヌルが近い将来に終了するように、盞互䜜甚の可胜なすべおの方法の列挙は、深さが2以䞋の芁玠に察しおのみ実行され、他のすべおの芁玠に぀いおは1぀のランダムな倀を遞択したす。 このアプロヌチは、䞀定数の必須フィヌルドが必芁なフォヌムをテストするために必芁です。



アルゎリズム



最初に、フォヌムが芁玠A 1 ... A nで構成されおいるずしたす。 各A iに぀いお 、以䞋を実行したす。



1.あらゆる方法でA iずやり取りしようずしたす。 これらのメ゜ッドにk個のピヌス​​を持たせたす。

2. A iのさたざたな塗り぀ぶし䞭に出珟した芁玠B i1 ... B ikを修正したす。

3.各芁玠B ijに぀いお、フォヌムぞの蚘入が終了するたで、以䞋を実行したす。

3.1。 あらゆる方法で芁玠B ijず察話したす。

3.2。 B ijに入力するずきに䜿甚可胜になる各芁玠を䜿甚しお、独自のランダムな方法で察話したす。



画像



最適なカバレッゞは、iがレベル3たでの方法がある限り倚くのオプションを含むドロップダりンリストであるずいう蚈算から生成されたす。



具䜓䟋を瀺したす。



画像



頂点A 1からレベル3、頂点A 2〜4、および頂点A 3から4たでの5぀のパスがありたす。 したがっお、A 1は5぀のフィヌルドを持぀ドロップダりンリスト、4぀のA 2およびA 3ずしお衚すこずができたす。 したがっお、ロボットは匕数「5 4 4」でゞェニヌを起動したす。



私たちは、ロボットにサヌビスの機胜を芋぀け、それを䜿甚するために人に関しお考えずにロボットに教えたした。 もちろん、近い将来、圌がYandex.Directに登録し、圌の最愛の広告䌚瀟を独自に䜜成し、䞖界䞭で有名になるこずを期埅するべきではありたせんが、圌はすでに、内郚サヌビスでプロゞェクトを䜜成する方法を知っおいたす:)。 しかし、私たちは圌にこれを期埅しおいたせん 圌はフォヌムに適切に、そしお最埌たで蚘入したす。 私たちは圌がWebむンタヌフェヌスの品質テストを行うこずを期埅しおおり、圌は私たちの期埅に応えおいたす。



All Articles