Selenium Manager単䞀のむンタヌフェヌス履歎

こんにちは、Habr



私の名前はVitaliy Kotovで、Badooで働いおいたす。 以前の蚘事の 1぀で、テスタヌず開発者の䞡方が自動テストず察話するのに圹立぀特定のむンタヌフェむスがあるず述べたした。



圌に぀いおもっず話すように頌たれたした。



カットの䞋で、私は最終的にこのむンタヌフェヌスがどのように曞かれ、䜕ができるかに぀いおお話したす。 根付いた機胜ず、䜕らかの理由で請求されおいないこずが刀明した機胜に぀いお説明したす。 おそらく、いく぀かのアむデアはあなたにずっお面癜そうだず思われたすし、そのような「ヘルパヌ」に぀いおも考えるでしょう。







それがすべお始たった方法



したがっお、すべおはSeleniumテストから始たりたした。 したがっお、むンタヌフェヌスの名前-Selenium Manager。 珟圚では、 Smokeテストを実行するこずもできたす。



ある時点で、テストで倚くのこずができるこずに気付きたした。 たた、起動時に指定できる远加のキヌの数によっお明らかになり、テストは䜕らかの方法で実行されたした。 それらのほんの䞀郚を次に瀺したす。





などなど。 合蚈で、25個のキヌをカりントしたした。 たた、そのうち11個に぀いお、倀に3぀以䞊のオプションを指定できたす。 これは非垞に倚く、これらすべおを念頭に眮いたり、ヘルプコマンドを際限なく䜿甚したくはありたせんでした。



最初のバヌゞョン



むンタヌフェむスの最初のバヌゞョンは2014幎に登堎したした。 私の考えによるず、圌は蚭定から​​すべおの可胜なキヌず倀を解析し、ブラりザに察応するHTML芁玠のセットを描画するだけでした。 ナヌザヌが必芁なパラメヌタヌのセットを蚭定し、「get start command」ボタンをクリックするず、画面に察応する行が衚瀺され、端末にコピヌできたす。



倕方、プロトタむプを「投げる」ず、私はそれをみんなに芋せに行きたした。 もちろん、誰もが「しかし、このむンタヌフェむスからすぐにテストを実行できるかもしれたせんか」ず答えたした。 もちろん、かなり期埅されおいたす。



私はこのように考え始めたした...



むンタヌフェむスからテストを実行する



テストはPHPで曞かれおいたす。 「ランチャヌ」ずしお、PHPUnitを䜿甚したす。 コン゜ヌルからテストを実行するずいうアむデアは、次のずおりです。必芁なパラメヌタヌセットを蚭定し、テストを指定し、テストコヌドが実行されるサヌバヌにAJAXリク゚ストで送信したす。



サヌバヌ偎では、 execコマンドを䜿甚しお起動されるコマンドラむンが生成されたす。 コマンドをコン゜ヌルから切り離すこずを忘れないでください。そうしないず、テスト自䜓が実行されおいる限り、execが実行されたす。 これは必芁ありたせん-プロセスのPIDのみを取埗する必芁がありたす。



このようなもの



function launchTest($cmd, $logfile) { $cmd = escapeshellcmd($cmd); exec($command = 'sh -c "' . $cmd . '" > ' . $logfile . ' & echo $!', $out); if (count($out) !== 1) { die("Wrong launch command: {$command}"]); } return $out[0]; }
      
      





コンテキストからわかるように、たずテスト䞭にログを曞き蟌むログファむルを䜜成したす。



PIDを受け取ったら、それず、単玔なsetIntervalを実行するクラむアントぞのログファむルぞのパスを返したす 。 N秒に1回、クラむアントはサヌバヌをノックし、ログファむルずPIDステヌタスの珟圚の内容を受け取りたす。 PIDがない堎合、 clearIntervalが呌び出されたす。 ずおも簡単



  var interval_id; function startPidProcessing() { interval_id = setInterval(self.checkPid, 4500); } function stopPidProcessing() { clearInterval(interval_id); interval_id = null; }
      
      





したがっお、テストに合栌する進捗が確認できたす。 そしお、い぀終了したかを知っおいたす。



耇数のテストを䞊行しお実行する



2013幎に、PHPUnitはテストを䞊行しお実行できたせんでした。 そしお、それでも深刻な問題でした。それでも、私たちは非垞に倚くのSeleniumテストを持っおいお、1時間以䞊1぀のストリヌムに入るこずができたした。 それから私の同僚のむリダ・クディノフは、ナニットテストでこの問題をどのように解決し始めたかに぀いお蚘事を曞きたした。



しかし、最終的な゜リュヌションはSeleniumテストにはあたり適しおいたせんでした。



最適な゜リュヌションはSelenium Managerでした。 結局、1぀のテストをそこから起動できる堎合、新しいタブを開いお2番目のテストを開始しおみたせんか 冗談です...



これは同じタブから実行できたす。 これを行うには、各テストのPIDのリストをクラむアント偎に保存し、サヌバヌぞの芁求に応じおそれらすべおをポヌリングし、それぞれのステヌタスを返すだけで十分です。 ログファむルも同様です。



同時に起動するテストの数をむンタヌフェむスに蚭定する機胜を远加したした。 実際、これはテストが実行されるスレッドの数です。 テストの総数よりもスレッドが少ない堎合、テストはキュヌに入れられ、実行䞭のスレッドの1぀が実行されるのを埅ちたす。



フィルタヌおよびグルヌプテストの実行



これは十分ではありたせんでした。 ここで、タヌミナルを開き、そこから必芁なすべおのテストファむルにパスをコピヌする必芁がありたした。 さらに、ファむルからすべおのテストを実行するのではなく、䞀郚のみを実行したい堎合がありたすこのため、 フィルタヌパラメヌタヌはPHPUnitに存圚したす。



この問題を解決するために、クラス名のみを蚘述し、「::」を䜿甚しおフィルタヌを指定できる単玔なtextarea HTML芁玠をクラむアント䞊で䜜成したした。 たずえば、次のように







そこに䜕かを曞いたり、TeamCityから萜ちたテストのリストをコピヌするこずもできたす。 これらはすべおサヌバヌに送信され、解析されたした。 ある組み合わせがそのようなテストがあるクラスの名前のように芋えるかどうかを刀断する方法は そしお、このクラスでファむルぞのパスを決定しおテストを実行したすか



私の方法は次のようになりたした



  public static function parseTestNames($textarea) { $parts = preg_split('/[,\s\n]+/', $textarea); $tests = []; foreach ($parts as $part) { $part_splited = explode('::', $part); $filter = $part_splited[1] ?? false; $testname = $part_splited[0]; if (is_file($testname)) { $testname = $filter ? $testname . '::' . $filter : $testname; $tests[] = $testname; } else { $found_tests = self::findPathByClassName($testname, $filter, $hard); foreach ($found_tests as $test) { $test = $filter ? $test . '::' . $filter : $test; $tests[] = $test; } } } $result = array_values(array_unique($tests)); return $result;
      
      





コンテンツをスペヌスたたはハむフンで区切りたす。 次に、各パヌツを順番に凊理したす。 その䞭で、たずフィルタの倀を取埗するために「::」の組み合わせを探したす。



次に、最初の郚分「::」蚘号たでを芋おください。 ファむルぞのパスずしお指定されおいる堎合は、実行したす。 そうでない堎合たずえば、クラスのみが指定された堎合、findPathByClassNameメ゜ッドを実行したす。このメ゜ッドは、テストフォルダヌ内のクラスの名前で怜玢し、必芁なパスを返すこずができたす。



PHPUnitには、テストのグルヌプを尋ねる機胜がありたす詳现はこちら 。 そしお、それに応じお、これらのグルヌプを指定しおテストを実行したす。 これらのグルヌプは、これらのテストをカバヌするサむトの機胜に関連付けられおいたす。 倚くの堎合すべおではありたせんが倚くのテストを実行する堎合は、いく぀かのグルヌプに察しおテストを実行する必芁がありたす。



同じ怜玢を䜿甚しお察話的に取埗されるグルヌプのリストを远加したした。グルヌプのいく぀かを遞択し、パスずクラス名を指定せずにテストを実行できたす。



グルヌプでテストを実行するためのむンタヌフェむスは次のようになりたす。







これで、グルヌプたたはこれらのテストの名前のリストでテストを実行できたす。



実行䞭のテスト自䜓は次のようになりたす。







テストが既に実行されおいる堎合は、黄色でマヌクされたす。 緑-成功した堎合、赀-萜ちた堎合。 青色は成功したテストを瀺したすが、その䞭にはスキップされたテストがありたす。



セル内には通垞のログがあり、PHPUnitを介しおテストを開始するず衚瀺されたす。







テストが成功したかどうかの刀断は、正芏衚珟を䜿甚しおクラむアント偎で非垞に簡単に実行できたす。



  function checkTestReport(reg_exp) { let text = $(cell_id).html(); let text_arr = text.split("\n"); if (text_arr[0].search('PHPUnit') != -1) { return reg_exp.test(text_arr[2]); } else { return -1; } } this.isTestSuccessful = function(cell_id) { return checkTestReport(/^[\.]+\s/); }; this.isTestSkipped = function(cell_id) { return checkTestReport(/^[\.SI]+\s/); };
      
      





これは、最もフォヌルトトレラントな゜リュヌションではありたせん。 ある日PHPUnitの䜿甚を停止した堎合、たたは出力行が倧幅に倉曎された堎合、メ゜ッドは動䜜を停止したす「-1」ずいう回答を受け取るこずで、このこずを確認できたす。 しかし、どちらも近い将来に発生する可胜性はありたせん。



クラりドでテストを実行する



テストを実行するためのむンタヌフェむスを䜜成しおいる間、ショットのテストの実行を積極的に開始したした。 TeamCityでは、必芁なだけテストを実行するのは簡単ではないこずがわかりたした。 十分な゚ヌゞェントはありたせんが、高䟡です。



次に、テストの開始を「クラりド」システムに移行したした。 圌女に぀いおは、次回詳现な蚘事を曞くかもしれたせん。 それたでの間、このシステムは「クラりド」であるため、ログを収集するのは問題があるずいう事実に焊点を圓おたす。



実行の最埌にテストが結果の蚘録を開始する単玔なMySQLタブレットを䜜成したした。テストは成功たたは倱敗し、゚ラヌ、継続時間などが続きたす。



この衚に基づいお、Selenium Managerの別のタブで、ショットの名前で実行の結果を描画し始めたした。 萜ちたテストをむンタヌフェむスから盎接再開する機胜テストが正垞に合栌するず、萜ちたテストのリストから消えたすたたはこのテストが同じ゚ラヌで他のショットでクラッシュしたかどうかを確認したす゚ラヌトレヌスによっお決定されたす







゚ラヌのタむプ同じトレヌスでテストをグルヌプ化するか、アルファベット順に䞊べるこずができたす。



調査システム



䞊蚘のペヌゞに加えお、もう少し詳しく説明したいず思いたす。 これは調査ペヌゞです。 重芁なタスクがマむナヌバグでテストに入るこずがありたす。 ナヌザヌに圱響を䞎えないJS゚ラヌを蚀いたす。 このようなタスクをロヌルバックするこずは実甚的ではありたせん。 次のように進みたす。バグチケットを開発者に眮き、タスクをさらにスキップしたす。



しかし、ステヌゞングずショットの䞡方に正盎になり、生掻を劚害し、ログを詰たらせるテストをどうすればよいですか 私たちはそれがなぜ萜ちるのかを知っおおり、タスクが完了するたでそれが萜ち続けるこずを知っおいたす。 それを実行しお期埅される結果を埗るのに時間の䟡倀はありたすか



私は次の方法で問題を解決するこずが可胜であるず決めたした同じMySQLですべおがタブレットを䜜成し、そのタブレットにむンタヌフェヌスを介しおチケットのテストが远加されたす。



開始前のテストはこのリストを受け取り、その名前ずリストの名前を比范したす。 テストを起動する必芁がない堎合、ログ内の察応するタスクでスキップ枈みずしおマヌクされたす。



たた、王冠の王冠に行き、タスクのリストを受け取り、それらのステヌタスに぀いおJIRAバグ远跡システムに行く簡単なスクリプトを曞きたした。 タスクが閉じられるず、調査テヌブルの゚ントリが削陀され、テストが自動的に開始されたす。



Selenium Managerで他にできるこず



䞊蚘に加えお、Selenium Managerには、興味深く同等に圹立぀ものがたくさんありたす。



たずえば、珟圚のビルドのすべおのショットのリストを取埗し、それぞれに察しお指定されたテストを実行したす。 これは、テストがステヌゞングで萜ち始めたずきに非垞に圹立ち、手ず目で有眪のチケットを決定するこずができたせんでした。



䞍安定なテストのリストず最も䞀般的な゚ラヌ異なるテストの堎合が衚瀺される衚のあるペヌゞもありたす。 テストの順序を保぀のに圹立぀ため、自動化゚ンゞニアにずっお䟿利です。 Seleniumテストは、他のUIテストず同様に、定矩䞊䞍安定であり、これが正垞であるこずを忘れないでください。 しかし、それらを安定させるために最も「悪い」テストの統蚈を取埗するこずは良いこずです。



各テストの反察偎にあるこのプレヌトには、ワンクリックでテストを安定させるためのチケットを䜜成および転送できるボタンがありたす。 チケットぞのリンクはテヌブルに残るため、誰かがすでにテストを行っおいる堎合は衚瀺されたす。



次のようになりたす。







Seleniumファヌムノヌドのグラフィックが存圚するペヌゞがありたす。 自動化゚ンゞニアのArtyom Soldatkinは、Seleniumにパッチを適甚する方法に぀いお既に説明しおいるため、HTTPリク゚ストにより、これらのブラりザヌずバヌゞョンでグルヌプ化された無料のブラりザヌの数に関するデヌタを取埗できたす。 詳现に぀いおはこちらをご芧ください 。



Seleniumファヌムに移動し、MySQLタブレットに折りたたんでこの情報を収集する簡単なスクリプトを䜜成したした。 クラむアント偎では、 plotly.jsを䜿甚しお、このデヌタに基づいおグラフを描画したした。



次のようになりたす。







したがっお、すべおのニヌズに十分な胜力があるかどうかを確認する機䌚がありたす。 :)



根付かなかった機胜



ほずんどの堎合、詊しおみるたで機胜が圹立぀かどうかを事前に蚀うこずはできたせん。 䞀芋有甚なアむデアが䞻匵されない堎合がありたす。



たずえば、誰もが特定のテストたたはテストのグルヌプにサブスクラむブできるペヌゞがありたした。 これらのテストがステヌゞングに該圓し始めるず、すべおの眲名者がチャットで通知を受け取りたした。



圓初、手動テスタヌ自身がテストのステヌタスを監芖する堎合、これは開発たたはショットで完党にテストできないタスクに圹立぀ず考えられおいたした。 眲名するこずで、圌は説明に適合するテストのグルヌプがステヌゞングで壊れ、タスクにいく぀かの問題があるこずを理解できたした。



実際、テストのグルヌプを予枬するこずは困難であるこずが刀明したした。 ほずんどの堎合、倚くの䞍必芁な通知が来たしたが、萜ちたテストは他のグルヌプからのものだったため、必芁な通知が届かないこずもありたした。



その結果、前のスキヌムに戻り、自動化゚ンゞニア自身がテスト郚門の担圓者に問題があるこずを通知したした。



たずめ



むンタヌフェむスはテストプロセスに正垞に統合されたした。 これで、任意のパラメヌタヌを䜿甚しおテストを簡単、簡単、迅速に実行し、その安定性ず自動テストシステム党䜓を監芖できたす。



䞀般的に、コン゜ヌルから逃げるこずができたこずを嬉しく思いたす。 䜕か悪いこずがあるからではなく、単にこの堎合のむンタヌフェヌスが䟿利に費やすこずができる倚くの時間を節玄するからです。



これからどのような結論を匕き出すこずができたすか ツヌルを䜿甚しお䜜業を最適化し、簡玠化したす-そしお、あなたは幞せになりたす。



ご枅聎ありがずうございたした。



All Articles