したがって、抽象的な状況を想定します。SeleniumWebDriverを使用して記述されたテストスイートがあるとします。 それは絶えず補充され、新しい詳細で生い茂り、あなたはログ、XMLの山を理解し、何がなぜ飛んだのかを見て考えることは本当に耐えられません。 以下では、Seleniumテストを安定させるための簡単なヒントをいくつか紹介し、Jenkins CIとSeleniumを友達にする方法と、この友情の結果について説明します。 興味のある人のために-猫をお願いします。
1. Selenium WebDriver
Seleniumをサードパーティのものと統合する前に、高い安定性を実現する必要があります。 これらの言葉はどういう意味ですか? すべてが非常に単純です。テストを実行する回数、テストするWebアプリケーションの負荷、および米国の対外債務の規模に関係なく、テストは同じ結果を示すはずです。 テストが完璧だと思う場合は、数百(ここで必要な数に置き換えて)均一なテストのインスタンスを実行してみて、Webアプリケーションの最大許容RAMサイズをカットするか、他の方法でテスト対象の製品をひどいブレーキで動作させてくださいテストで大量の厄介なバグを取得します。ページ上のアイテムがロードされない場合は、しばらくお待ちください。
インドのコーダーのすべての問題を解決するためのかなり一般的なアプローチは次のとおりです。Thread.sleep(1000);
通常、このようなコード行には、「id = myUnicID1 presentの要素を待機する」という精神でコメントが付けられています...正確に1000ミリ秒待機する必要がある理由は明らかではありません。 その結果、ある時点で必要な要素が1003ミリ秒間表示され、 NoSuchElementExceptionの精神でエラーが発生してテストがクラッシュします。
当然、エンコーダーは問題が何であるかをすぐに認識し、かなり簡単な解決策を見つけます。
Thread.sleep(5000); // 5 -
300人のテスト、誰もが5秒間何もしない= 25分間、理解できないものに費やしますが、上記のエラーが表示されないことは確かです(もちろん、すべてはプロジェクトとテストされる条件に依存し、5秒間ではない状況が可能ですそして、さらに多くのそのようなテストがあり、「疑わしい」要素の数がある場合は?
もう少し考えた後、問題に対するもう少し合理的な解決策が思い浮かびます:
while(!driver.isElementPresent(By.id("myUnicID1") ) ){ Thread.sleep(500); }
特定の既知の状況では、このソリューションはコードと同等です。
while(true){ Thread.sleep(500); }
しかし、面白いのは、このコードが私たちを素晴らしい、しかし同時に非常に単純なアイデアに追いやるということです-ドライバー用の「スマートな」シェルを書くことです。 したがって、必要なすべての要素の描画と、すべてのAJAXリクエストの完了を待つ必要があります。 これがどのように実装されるかはここでかなりよく説明されます 。 より複雑な実装が必要な場合は、インターネット上に既製のソリューションがたくさんあります。
ドキュメントにないものはすべて不可能です。
実際、ドキュメントにはテスト用のかなり豊富な機能が用意されていますが、それはすべてではありません。 たとえば、textareaからテキストを取得したい場合があります。getText()メソッドを使用すると、空の文字列が返されます-神秘的なjsやその他のhtmlコードのキットが邪魔になります。 特定の要素の色を知る必要がある場合、または属性に関する情報を取得する必要がある場合 executeScript()を使うことを恐れないでください。jsとjQueryの機能は気にするべきではありません。テストをカバーするのに役立つはずです。 覚えておくべき主なことは、スクリプトが何らかの値を返す必要があるということです(実行の結果)。 スクリプトが有用な情報を返さないが、いくつかのマジックアクションを実行する場合、マジックが成功した場合はtrueを返します。 Seleniumを使用すると、マウス操作、キーストローク、ポップアップの確認、アクティブな要素のドラッグなどを自信を持ってテストできます。アイテムは見つかりませんが、見えます!
xpathが要素を正しく指していることを100回確認し、他のすべての方法でそれを特定しようとしましたが、トレース内のすべてのエラーが見つかりませんでした。 この種の状況は、ほとんどすべての精神を揺さぶり、何が起こっているか(または不注意)の誤解から生じます。 SeleniumDriverのバージョンがこれまたはその機能をサポートしていないと感じることさえあるかもしれませんが、必要な機能をサポートしていないバージョンをここで見つけた場合、あきらめることができます。 しかし、原則として、問題はコードにあります。 あなたがそれを見つけることができないが、私はそれが確かであると確信しているなら、おそらくあなたはただそこを見ていません。 そして、私はそのフレームにいますか? それらを正しく切り替えていますか? 通常、これら2つの質問に対する答えは解決策です。抜粋!
多くのSeleniumテストは、Firefoxから明示的に非表示になっている30メートルのxpathを持つ要素の連続したクリックのように見えます。 多くの場合、テストでは、同じ要素または基本的なアクションセットのクリックがほぼ重複します。 また、アプリケーションに新しい機能が追加され、「A」ボタン(2番目のテストごとに存在する)を押すことが機能しなくなった場合はどうなりますか? プロジェクトをルート化してリファクタリングするのは本当に不便ですか? これらの要素の一意の識別子をすべて含むクラス(または複数)を作成する方がはるかに便利です。 多くの箇所を探して修正するよりも、1行を変更する方が簡単です。2. TestNG
たまたま、セレンテストが従来のjUnitではなくTestNGで実行されています。 もちろん、それはすべてあなたの選択に依存しますが、テストグループとパラメーター化されたアセンブリの事前/事後条件を設定する機能は魅力的です。 誰かが興味を持っているなら、 ここでそれらについてかなりよく書かれています 。 テストの実装に進むのは意味がないと思います。概念を指で説明するだけです(必要に応じて、説明用のコード例を添付します)。 テストの各グループは、抽象クラスから継承する独自のクラスに実装されます。 テストが正常に完了するための条件は、結果のXMLファイルがローカル(参照)ファイルと一致することです。 テスト要件:実行速度、テスト実行時間は事前/事後条件を考慮しない、テストは理解しやすい、ランダム実行エラーは発生しない、エラーの原因はtrace'aから明確にする必要がありますしたがって、特定の問題の本質を説明する追加のException'ovを多数作成しました。 必要な要素には何らかの識別子の「リポジトリ」があり、フレーム間の切り替えのロジックは、比較的複雑なメソッド(一連の単純なアクションを組み合わせたもの)に縫い付けられています。
3.ジェンキンスCI
最後に、これらのすべての魅力を、どこかで継続的にスピンし、エラーがあれば報告する何らかのサーバーに修正する必要があります。 CIとして、私はJenkinsを使用します。 Seleniumがグラフィカルシェルなしのサーバーで正常に動作するには、xvfbをインストールする必要があります。次に、xvfbを実行しようとする必要があります。十分なフォントやその他の些細なことがなければ、必要なものをすべて提供する必要があります。 この命令を使用できます。 xvfbが安定して動作するようになったので 、 jenkins'aのxvfbプラグインをインストールする必要があります(もちろん、それなしでも実行できますが、自己記述スクリプトを再度使用しないようにしています)。 jenkins'aの設定でxvfbのアドレスを指定し、プロジェクト構成で有効にします その後、テストを実行し、 このプラグインを使用して実行結果を公開する必要があります 。 このすべてに電子メール通知を追加すると、何かが壊れた場合に心配する完全に自己完結型のテストシステムであることがわかります。 それだけです、それほど難しくありませんよね?yum install Xvfb