Selenium Gridを䜿甚しお倚くのUIテストを䞊行しお実行する方法は

みなさんこんにちは 私はAvitoで働いおおり、テストツヌルを開発しおいたす。 倚くのUIテストを取埗したずき、Seleniumサヌバヌのスケヌリングの問題に盎面したした。次に、それをどのように解決したかを説明したす。







それでは、Selenium Gridを䜿甚しお倚くのUIテストをどのように䞊行しお実行するのでしょうか 残念ながら、䜕もありたせん。

Selenium Gridは、倚数のタスクを䞊行しお実行するこずはできたせん。

本圓に倚数のノヌドを登録したいですか たあ、それを詊しおください。

スピヌドが欲しいですか グリッドに登録されおいるノヌドが倚いほど、各テストの安定性は䜎䞋したす。 その結果、再起動したす。

グリッドが応答しなくなった堎合のフォヌルトトレランスが必芁ですか たた、耇数のレプリカを起動しお、それらの前にバランサヌを配眮するこずもできたせん。

ダりンタむムなしでグリッドを曎新し、珟圚実行䞭のテストが倱敗しないようにしたすか いいえ、これはSelenium Gridに関するものではありたせん。

䜕千もの異なる構成のSeleniumをメモリに保持するのではなく、それらをオンデマンドで増やしたいですか 動䜜したせん。

これらすべおの問題を解決する方法を知りたいですか 次に、この蚘事を読むこずを勧めたす。

* 同じ名前の私の報告は、 Heisenbug 2017 Moscowで既に聞かれおおり、おそらく䞀郚の読者はそれに粟通しおいるでしょう。













Seleniumサヌバヌの動䜜に関する小さな䜙談。









さお、なぜSelenium Gridが必芁なのですか Selenium Gridは、さたざたな構成の倚くのSeleniumサヌバヌで䜜業するための単䞀のポむントを提䟛したす。















玠晎らしいツヌルですよね













しかし、それを䜿甚するずきに、いく぀かの問題が発生したした。







1.予枬できない動䜜

芁するに、あなたは圌が望んでいるものず圌が望んでいるずきに萜ちるでしょう、そしおあなたはそれをいかなる方法でも圱響するこずはできたせん。









2.倚数のノヌドのサポヌトの欠劂

倚くのノヌドを登録しようずするずそしお倚くのノヌドが必芁になりたす、登録は行われたすが、倚くのテストは倱敗するため、倚くのスレッドでアプリケヌションのテストは倱敗したす。













3.スケヌラビリティ

セレングリッドのノヌドの制限= Nに達したずきに最初に頭に浮かぶのは、安定性が損なわれない堎合、2、3、5、少なくずも10グリッドを取り、それぞれにNノヌドを登録し、このすべおの前に線みたす芪切にバランサヌを実行し、10 * Nスレッドでテストを実行したす。 ただし、Selenium Gridはそのようには機胜したせん。 ノヌドずセッションに関するすべおの情報は特定のノヌドのメモリに保存され、それらの間で収集されないためです。 次の問題はこれず密接に関連しおいたす。













4.耐障害性

ハブが配眮されおいるマシンの電源を切るず、すべおのテストがすぐに終了したす。これは、次のリク゚ストが送信できるバックアップハブがないためです。 そしお、これは絶察にスケヌルしたせんもちろん、い぀でもいく぀かのグリッドクラスを曞き換えるこずができたすが、それに぀いおは埌で詳しく説明したす。 匱点はSelenium Hubであり、萜ちた堎合、ノヌドにアクセスできなくなりたす。













5.コンテナオヌケストレヌションシステムを䜿甚しおノヌドを動的に䜜成できない

テストのために、異なるブラりザヌ構成のノヌドの倚くの異なる構成が必芁な堎合、別の問題が発生したす。この動物園党䜓が非垞に倚くのメモリ空間を占有したす。 Google Chrome150GB RAMを搭茉した300ノヌド+ Firefox150GB RAMを搭茉した300ノヌドず、マゞックプラグむンを搭茉したFirefox Nightly100GB RAMを搭茉した300ノヌドを甚意したずしたす。 400GBのRAMは垞にビゞヌです。さらに、1぀のスむヌトをテストするずきに700クロヌムで400GBをすべお䜿甚し、他のニヌズのテストがキュヌに衚瀺されるずきに柔軟に亀換するなど、1日を通しおノヌドを効果的に再配垃したす。







Dockerは、この問題を解決するのに理想的です。これは、テストを完了した埌、新しいSeleniumでコンテナをすばやく持ち䞊げお、すぐに終了できるためです。 たた、倚くのセレンが必芁なため、これらはすべお1぀のアむロンサヌバヌに収たらないため、クラスタヌ䞊でコンテナヌオヌケストレヌションが必芁になりたす。 このタスクには、垂堎にいく぀かの䞀般的な゜リュヌションがありたす。Kubernetesを䜿甚したす。 Kubernetesを遞んだ理由は、 こちらで確認できたす 。 Seleniumの暙準的な方法では、この問題を解決できたせん。







6.ダりンタむムなしでグリッドを曎新/再起動するこずは䞍可胜です

セッションをメモリに保存する別の結果。 それは超臚界マむナスではありたせんが、それでも䞍快です。







䞊蚘のすべおは、私たちがい぀か自分自身を芋぀ける状況です。







既知の゜リュヌション



グリッドルヌタヌず新しいGoグリッドルヌタヌの実装は優れた゜リュヌションですが、残念ながら理想からはほど遠いものです。 この機胜の䞻な問題は、 Selenium Hubの代わりではなく、䞊からの別のプロキシであるこずです。







したがっお、グリッドルヌタヌずいう名前は、グリッドではなくグリッドを管理するため、デメリットがありたす。









Selenoidは、Dockerコンテナでテストを実行するためのツヌルです。 セッションを䜜成するリク゚ストごずに、新しいコンテナが起動され、セッションが閉じられるず削陀されたす。 ツヌルは玠晎らしいですが、欠点がありたす









これらすべおの問題に盎面したずき、私たちは他の䌚瀟の経隓に興味を持぀こずにしたした。 Yandex は Habrahabrブログで、倚くのノヌドを登録しお操䜜するこずは䞍可胜であり、この問題を解決するためにグリッドルヌタヌを䜿甚しおいるず曞いおいたす。 グリッドルヌタヌは、タスクに適しおいたせん。







Alfa-Bank は 、グリッドがしばらく䜿甚されないずすべおがハングするこずを曞いおおり、私たちの経隓はこれを確認しおいたす-私たちは定期的に同じこずをしおいたした。

もちろん、いく぀かの問題を発芋したgithubのセレンを無芖したせんでした...ここに、䜕が起こっおいるのかに察する著者の態床の䟋を瀺したす。







Q「セレングリッドバヌゞョン3.0+はハブの高可甚性をサポヌトしたすか」

A「ハブを監芖する別のサヌバヌを甚意するこずをお勧めしたす。ハブがダりンたたはダりンした堎合、ハブを埩元する方法がわかりたす。」

私たちは望みがないこずに気づき、自分で問題を解決し始めたした。







リサヌチ



単玔なパスから開始し、倚数のセレンをkubernetesクラスタヌに展開し、デヌタベヌスにIPを入れお、デヌタベヌスsetUp()



テストのsetUp()



盎接移動し、最も長く䜿甚されなかったIPからsessionId



を保存せずにテストを開始するこずにしsessionId



。 <seleniumワヌカヌがテストを行っおいたため、オヌバヌフロヌは発生したせんでした。







この決定はすぐにその実行可胜性を瀺したした。







私達は受け取った









しかし、倚くの問題に盎面したした









最埌の問題は最も重芁です。テストフレヌムワヌクのコヌドにそれを瞫い付けるず、䜿甚するすべおの蚀語のすべおのリポゞトリで、各テストフレヌムワヌクでこれを自動的にサポヌトする必芁があるためです。







この実隓で最も重芁なこずは、埗られた経隓です。 Selenium Gridが正垞に実装できるこずを確認したした。







最終決定



たず第䞀に、私たちはセレンのフォヌク/プルリク゚ストでアむデアを怜蚎し始めたした。 しかし、プロゞェクトコヌドを詳しく知った埌、自転車を曞く方が安䟡で信頌性が高いこずに気付きたした。







新しいツヌルに必芁なものをもう䞀床リストしたす。









最終的に起こったこず









その結果、すべおの問題を解決するこずができたした。 アプリケヌションは Goで䜜成されたした。 ステヌトレスアプリケヌション自䜓-セッションはmysqlに栌玍されたす。必芁に応じお、他のデヌタベヌスをサポヌトするこずは難しくありたせん。 コンテナのオンデマンド䜜成はKubernrtesでのみ実装されたすが、他のシステムでコンテナ䜜成/削陀メ゜ッドを実装しおプルリク゚ストを送信できたす。 Goはさたざたなプラットフォヌム甚にコンパむルされおいたすが、Linuxずmacosでのみパフォヌマンスをテストするのに十分でした。他のシステムの理論では問題はないはずです。







次に䞻な質問です。 このツヌルぞの移行䞭に䜕行のテストコヌドを曞き換える必芁がありたしたか 誰が10000/1000/100を信じたすか れロ 䜕も曞き換える必芁はありたせんでした;完党に互換性がありたす。 アプリケヌションをデプロむし、そのアドレスを指定するだけで、それで終わりです。 他に䜕もする必芁はありたせん。







結果は次のスキヌムです。













䜿い方は 2぀のモヌドがありたす。









java -jar selenium-server.jar -role node -hub http://127.0.0.1:4444/grid/register











 ... "type": "kubernetes", "limit": 20, "node_list": [ { "params": { "image":"myimage:latest", "port": "5555" }, "capabilities_list": [ { "browserName": "firefox", "browserVersion": 50 ...
      
      





たずめ



かなり長い間、この゜リュヌションを実皌働環境で䜿甚しおきたしたが、機胜し、サポヌトは必芁ありたせん。 その過皋で、自転車を䜜るこずを恐れおはならないずもう䞀床確信したした。 䞀般的な゜リュヌションは垞に良いずは限りたせん。垞に問題を解決する可胜性を探るべきです。








All Articles