2017-11-18 3 views
1

私は、テスト自動化のためにnodejsとnighwatchを使用するプロジェクトに取り組んでいます。ここでの問題は、テストが信頼できるものではなく、誤検出が多いことです。私はそれらを安定させ、まだエラーを得るためにすべてをやった。私はhttps://bocoup.com/blog/a-day-at-the-racesのようないくつかのブログに行き、いくつかのコードリファクタリングを行った。この問題を解決するための提案がありましたか?この瞬間に私は2つの選択肢があります。Javaでコードを書き直すか(ソリューションからnodejとnightwatchを取り除くか、私はJavaとJavaの方がはるかに快適だからです)、ほとんどの場合、Javascriptの非ブロック性と闘います。スナップショット/アプリケーションログのレビュー/一度に1つのテストを実行します。テストサーバー上でのセレンテストのランダムな失敗

テスト環境: -

  • サーバー-Linux
  • ディスプレイ - フレームバッファ
  • 総VMの-9セレンノードが並行してテストを実行しています。
  • ブラウザ - クロム
  • 私は見られない要素であり得るエラーの

タイプ。ほとんどの場合、ページがロードされるとすぐにテストが失敗します。私はすでに時間切れのために80秒を設定しているので、時間は問題にならない。テストは並行して実行されていますが、別々のVM上で実行されているため、問題が発生するかどうかはわかりません。

編集1: - 根本的な原因を知るためにこれを進めていました。私はランダムな失敗を排除するために以下のことをしました: - a。 --suiteRetriesを追加して、失敗したケースを再試行します。 b。エラーのスクリーンショットとDOMソースを調べました。すべてがうまく見えます。 c。 browser.pauseを明示的な待機に置き換えました

また、デバッグ中に1つの問題が発生しましたが、これはランダムなエラーの原因となる問題かもしれません。ここでは、コードスニペット

for (var i = 0; i < apiResponse.data.length; i++) { 
    var name = apiResponse.data[i]; 
    browser.useXpath().waitForElementVisible(pageObject.getDynamicElement("@topicTextLabel", name.trim()), 5000, false); 
    browser.useCss().assert.containsText(
    pageObject.getDynamicElement("@topicText", i + 1), 
    name.trim(), 
    util.format(issueCats.WRONG_DATA) 
); 

}

私はそのテキストが表示されるのに十分な待っているかどうかを検証するためのXPathのチェックを追加したのです。私は目に見えるアサーションが渡されているのを観察しましたが、次のアサーションでは@topicTextが以前の値またはnullになっています。これは断続的な問題ですが、テストサーバーで頻繁に発生します。

+1

エラー・スタック・トレースとともにコード・トライアルを共有できますか? – DebanjanB

+0

"80秒でタイムアウト"とはどういう意味ですか? 80秒後に失敗したページでターゲットとする最初の要素を明示的に待ちますか?あるいは、あなたはいつも80秒待つのですか? – danidiaz

+0

@danidiaz - はい私は明示的な待機を実行しており、最大タイムアウトは80秒です。 –

答えて

1

脆弱なUIエンドツーエンドテストには魔法の弾丸はありません。理想的な世界では、問題をすばやく簡単に解決するオプションset avoid_random_failures=trueがありますが、今のところそれは夢です。

Javaのすべてのテストを単純に書き直しても問題は解決しませんが、Javaの方が気分が良ければ、間違いなくその方向に進んでいきます。


あなたはすでにこの記事から知っているようにAvoiding random failures in Selenium UI tests 3つの一般的に使用される回避UIテストで競合状態のための技術があります。webdriverをの「暗黙の待ち時間」パラメータ を使用して、一定sleep

  • を使用して

    1. は、明示的待機を使用する
    2. (WebDriverWait + ExpectedConditions + FluentWait)

    方法1及び2は、一般的に推奨されていない、彼らはdrawbaksを持って、彼らは、単純なHTMLページ上でうまく動作することができますが、そうではありません:

    これらの技術はまた、簡単にWebDriver: Advanced Usageに記載されている、あなたもここでそれらについて読むことができます100%AJAXページで実現可能、彼らはテストを遅くする。 #3 - 明示的な待機がベストです。技術#3を使用するためには


    (明示的な待機)あなたは(私は彼らのJavaのバージョンを指しますが、彼らは他の言語での対応を持っている)を理解し、次のwebdriverをツールと快適にする必要があります。

    ExpectedConditionsは、多くのpredefiniedは状態、ほとんどの(私の経験で)使用される要素が表示され、あなたがそれをクリックすることができるように有効になるまで待つExpectedConditions#elementToBeClickableで待っています。

    使用方法 - 例:データを入力するいくつかのフィールドを含むフォームを含むページを開きます。もはやけど - ページがロードされ、レンダリングされた後field1が編集可能になるまで、上記のコードは待機

    By field1 = By.xpath("//div//input[.......]"); 
    By field2 = By.id("some_id"); 
    By field3 = By.name("some_name"); 
    By buttonOk = By.xpath("//input[ text() = 'OK' ]"); 
    .... 
    .... 
    WebDriwerWait wait = new WebDriverWait(driver, 60); // wait max 60 seconds 
    
    // wait max 60 seconds until element is visible and enabled such that you can click it 
    // if you can click it, that means it is editable 
    wait.until(ExpectedConditions.elementToBeClickable(field1)).sendKeys("some data"); 
    driver.findElement(field2).sendKeys("other data"); 
    driver.findElement(field3).sendKeys("name"); 
    .... 
    wait.until(ExpectedConditions.elementToBeClickable(buttonOK)).click(); 
    

    :通常は(クリッカブル)最初のフィールドがページに表示され、それが編集可能になりますまで待つことenoughtではありませんまさにそれが必要である限りです。要素が表示されずに60秒後に編集可能になる場合は、TimeoutExceptionでテストが失敗します。
    通常、ページの最初のフィールドを待つだけです。アクティブになると他のフィールドも表示されます。

  • +0

    ええ、私はこれを行うための確実なショット方法がないことを知っていましたが、私は可能な限り最良の方法を選ぶことを望んでいました。あなたが与えた提案は良いです。私はそれらを試して更新します。 –

    関連する問題