0

PHPUnitを使用してアプリケーションコードを分離してテストしている間、QAチームはSeleniumを使用してUIをテストしています。テストが完了するまでに10時間以上かかると聞きましたが、これは長すぎると思います。私の質問は、ページを処理するときにAJAX呼び出しを待つ方法に関するものです。

たとえば、多数の入力があるページがあり、AJAX呼び出しを呼び出して、データを表示するためにサービスと通信します。複数の入力があり、変更された後続の選択ボックスをフィルタリングします。

地区(部門に属する)、店舗(地区に属する)と同様に、部門はすべてロードされます。

Division 1
    +- District 10
        +-  Store 100
        +-  Store 101
        +-  Store 102
    +- District 11
        +-  Store 200
        +-  Store 201
        +-  Store 202
Division 2
    +- District 20
        +-  Store 300
        +-  Store 301
        +-  Store 302
    +- District 21
        +-  Store 150
        +-  Store 151
        +-  Store 2002
...

これで、選択ボックスがすべて最初にロードされるため、エンドユーザーはそれらのいずれかを選択できます。ただし、選択ボックスで選択が行われると、AJAX呼び出しは、親の選択に基づいて他の選択ボックスをリロードします。IE:ディビジョン2を選択すると、地区リストは(サービスへの呼び出しを使用して)地区20と21のみにフィルターされ、ストアリストもそれらの地区の店舗のみにフィルターされます。

部門の選択をスキップして地区を選択すると、ストアリストはその地区の店舗のみに再フィルタリングされ、バックエンドのサービスが再び使用されます。

私の質問は、AJAX呼び出しがサービスから戻ってきて、選択ボックスが変更されたことを知る方法です。QAチームが待機しており、選択ボックスをループして、すべての戻り値が正しいことを確認します。選択ボックスのリロードがいつ完了したかを知る方法はありますか?そうすれば、内容を確認できますか?

明らかに、これらのチェックのほとんどをMockオブジェクトを使用したPHPUnitテストに移動して、サービスが機能することを検証したいと思いますが、QAチームは、実際にレンダリングされた結果が一致することを検証したいと考えています。

任意の提案をいただければ幸いです。

4

1 に答える 1

1

「Ajaxの呼び出しが完了するまで待つ方法」という質問を特定する

このシナリオには2つの異なるアプローチがあり、長所と短所をリストアップします。

アプローチ:1 保留中のAjax呼び出しの数を示すグローバル変数を使用してコードを追加します。これにより、セレンテキストでも同じ変数にアクセスできます。

$.activeAjaxRequestCount = 0;

$().ajaxSend(function() {
  $.activeAjaxRequestCount++;
  // register lazily to make sure it's the last handler of 
  // ajaxError event and get executed after all production handlers
  if(!$._ajaxErrorHandlerAdded) {
    $().ajaxError(function() {
      $.activeAjaxRequestCount--;
    });
    $._ajaxErrorHandlerAdded = true;
  }
})
.ajaxSuccess(function() {
  $.activeAjaxRequestCount--;
});


/* C# code in selenium tests */

// run this js code somehow before selenium test
// to turn off animation of jQuery
Selenium.executeScript("$.fx.off = true");

private void WaitComplete(Action action, int timeout)
{
  // do default selenium action
  action();
  // wait for active ajax request count becomes zero, 
  // none ajax selenium action will return immediately
  selenium.WaitForCondition("selenium.browserbot.getCurrentWindow();
                             window.jQuery.activeAjaxRequestCount===0;", 
                             timeout.ToString());
}

長所:完全にクライアント側

短所: 1つのページから発生した複数のajax呼び出しのうち、どのajax呼び出しが完了したかを特定するのは困難です。したがって、このアプローチでは...データがすでにページにロードされている可能性がありますが、すべてのajax呼び出しが完了するまで待つ必要があります。

参照:https ://gist.github.com/111525

アプローチ2:

このアプローチでは、ajax呼び出しが成功するのを待ち、データを表示/表示します。Seleniumでの表示:特定のHTMLエンティティ/データがページに表示されるまでテストの実行を待ちます。

var Waiting = new WebDriverWait(X, TimeSpan.FromSeconds(5));
var Data_Loaded = Waiting.Until(driver => driver.FindElement(By.Id("Divisionxyz")));

長所:単一のページでデータをフェッチするために複数のajax呼び出しが発生する場合は簡単です。

短所:動的要素/オブジェクトがロードされると、これは機能しません。

これがお役に立てば幸いです...すべての最高の相棒:)

于 2012-11-20T11:27:23.927 に答える