セレン試験の物語

チームが非常に大規模なプロジェクトを作成するタスクに直面すると、それは常に作成されたコードをテストするタスクになります。 サーバーのテストが比較的簡単な場合、JSコードはその性質上、ほとんどの場合テストが不可能です。



JSの性質は優れた開発チームによって回避されることが決定されました。このチームは、この種のユニークな製品を作成しました。これにより、ブラウザーと直接対話する受け入れテストを作成できます。 彼らはそれをとてもクールにやってくれましたが、レーキはそうでした。 そのため、この素晴らしい製品を使用しているときによく遭遇するレーキについてお話します。





そして、次のことについて話しましょう。

  1. テストアーキテクチャ
  2. テストを実行する
  3. コードベース
  4. タイムアウト
  5. テストコードとブラウザの相互作用。
  6. さまざまなランタイム環境
  7. ドライバーとセレン自体のバグ




この記事では、プロよりも初心者に焦点を当てています。







テストアーキテクチャ



多くの場合、コードの記述を減らしてコピーペーストを行わないようにテストを設計する方法について疑問が生じます。 言語のunitTestクラスを継承する一般的に使用される汎用ファイル。 他のグループに影響を与えることなく、常にテストのグループの動作を変更する機会があります。 例:



unittest.py seleniun/ - generic.py menu/ - generic.py - menuActionTest.py - menuDisableTest.py articles/ - generic.py - articlesLoadTest.py - articlesActionsTest.py
      
      







機能をカテゴリに分けたら、ディレクトリに配置し、各ディレクトリに独自のジェネリックを作成します。 各テストは、ディレクトリにある汎用クラスを継承する必要があります。 ジェネリックも空であるかもしれません、将来的には便利になるでしょう、私は保証を与えます。



テストを実行する



単体テストと受け入れテストの違いは、単体テストでは通常アルゴリズムとロジックをテストし、受け入れテストはシステム自体を既にテストし、実際のデータベースから取得した実際のデータを使用することです。



データベース


すべてのテストのタスクは、互いに分離することです。 そのため、テストを実行するたびに、新しいテストデータベースを作成する必要があります。 言語機能の各ユニットテストには、テストを実行する前に呼び出されるsetUpメソッドがあります。 データベースを初期化する前に、設定を変更してください。 そのため、他のテストや既存のデータから完全に分離でき、それでもキャッシュメカニズムを使用する場合は、キャッシュをクリアするか、データベースと同様に空のキャッシュストレージを使用します。



備品


実際、これはテストデータベースに書き込まれるデータなので、ブラウザーはサイトを開き、エラーを受け取りません。 基本データは、メインのジェネリックのsetUpメソッドで記述する必要があります。 そして、残りはテスト自体でデータが必要になると書き留めます。



データベースデータの保存


可能性のあるデバッグのパスを作成します。何らかの理由でテストがエラーで停止することがよくあります。データベースを保存してブラウザを存続させる必要があることがよくあります。 おそらく睡眠はあなたに合っていますか? データベースストレージ機能を実行した場合は、古いデータベースのクリーニングと同じことを実行します。 たとえば、私にとって、mongoDBは1週間の開発で80GBのデータベースを作成できました。



接続転送


ブラウザが開いたら、テストとは関係がないことに注意してください。 Seleniumが単にブラウザーを開き、操作の実行を開始する場合、ほとんどの場合、既存のプロジェクトでそれらを実行します。 目的のテストベースの識別に役立つパラメーターをブラウザーに渡します。 そのうち、ブラウザは情報をサーバーに転送する必要があります。



コードベース



ここでは、座って自分の人生をより美しくする方法を考える必要があります。

たとえば、非同期マルチユーザーリアルタイムアプリケーション(ゲーム)がある場合、2人以上のユーザーが対話できるテストを作成する必要があります。 ドライバーを使用してブラウザーウィンドウを切り替えることが便利かどうかを確認しますか? いいえ、簡単な実装を作成します。



独自のアサートが必要ですか? たとえば、ツリー内の要素の存在を確認しますか?



プロジェクトには独自の特性があり、このためのテストの機能部分を準備する必要がある可能性があります。



タイムアウト



テストするときは常に、タイムアウトを実行する必要があります。 これがページ読み込みの場合、サーバーへのajaxまたはソケットリクエスト。 ロードすると、ドライバーページには待機のための組み込みメソッドが含まれます。 しかし、ajaxとソケットのリクエストでは、すべてがより複雑になります。 送信された要求と受信された応答のカウンターを作成する必要があります。 要求を送信すると、カウンターが増加し、応答が到着すると、カウンターが減少します。 ジェネリック自体では、このカウンターをチェックするメソッドを実装し、0でない場合は待機させますが、待機を制限すると、サーバーからの応答が届かない場合があります。



テストコードとブラウザの相互作用。



状態やデータを受け取って、それらの値を期待される値と確認する必要がある場合があります。 このデータを取得する方法をすぐに記述します。 たとえば、AngularJSを使用する場合、サービスデータにアクセスするために、このレイヤーを作成します。



テストを使用してユーザーアクションをエミュレートする方法がない場合は、これらのイベントのハンドラーを呼び出す必要があります。 テストで実行可能なJSコードをノックできるようにします。



さまざまなランタイム環境



ほとんどの場合、テストはお使いのコンピューターで機能しますが、他のコンピューターでは機能しません。 これは、OS、セレンのバージョン、モニターの解像度、さらにはブラウザーのバージョンが原因である可能性があります。 テストを実行できる安価なVPSを入手することをお勧めします。 サーバーlinukhaでは、ブラウザーからテストを直接起動できます。 たとえば、私を助けてくれた人はwww.alittlemadness.com/2008/03/05/running-selenium-headlessでした 。さらに、テストの完了を待つ時間を節約できます。 ブラウザはRAMを非常に要求しているので、十分な量のスワップを追加してください。



ドライバーとセレン自体のバグ



まず、 code.google.com / p / selenium / issues / listにアクセスして、バグを確認します。



次に、これが機能することが確実な場合は、JSコードデバッグを実行します。 セレン自体やドライバーのせいでびっくりするような場所を見つける可能性があります。 たとえば、マウスが移動したときにchomedriverが現在のマウスボタンが押された原因であるイベントを送信しないと、バグに遭遇しました。



また、スクロールに関連付けられているよく知られている迷惑。 Seleniumは、本体からのスクロール以外のスクロール方法を知りません。 2つの解決策があります。 スクロール機能を記述するか、サーバー上の仮想モニターの高解像度を設定します。



多くの場合、タイムアウトが原因でテストが失敗する可能性があります。 テストが繰り返すことができる機能を使用します。 サーバーでテストを3回再起動する機会を彼に与えます。テストが失敗した場合、それは機能しません。定期的に失敗した場合、ユーザーには見えないがセレン自体には見えるタイムアウトに問題があります。



最後に



テストし、テストで修正されたバグを常にカバーします。 テストの実行時間は問題ではありません。主なことは、頭脳が常に安定して機能することです。



All Articles