2016-07-26 17 views
9

我維護一個使用量角器(2.5.x)進行E2E測試的複雜Angular(1.5.x)應用程序。這種方法遇到了一個問題,主要表現在測試看上去很脆弱。在一個拉取請求中完美運行的測試在另一個拉取請求中失敗。這涉及簡單的定位器,例如by.linkTest(...)。我調試了失敗的測試,並且該應用程序位於正確的頁面上,鏈接存在且可訪問。量角器片狀

是否有其他人遇到這些一致性問題?知道原因或解決方法?

回答

2

是的,我認爲我們所有人都經歷過這樣的片狀問題。

實際上,片狀是任何瀏覽器自動化工具的常見問題。然而,在量角器的情況下,這應該是較少的,因爲量角器具有內置等待考慮因素,只有在正確加載dom後才執行動作。但是,在少數情況下,如果您發現間歇性故障,您可能必須使用一些明確的等待。

我更喜歡使用一些智能等待的方法,如:

function waitForElementToClickable(locator) { 
     var domElement = element(by.css(locator)), 
      isClickable = protractor.ExpectedConditions.elementToBeClickable(domElement); 

     return browser.wait(isClickable, 2000) 
      .then(function() { 
       return domElement; 
      }); 
    } 

凡2000毫秒作爲超時,你可以把它配置使用variable.Sometimes我也一起去browser.sleep()當沒有我聰明的等待作品。

9

Just Say No to More End-to-End Tests!

這就是說,這裏是你可以做,以解決我們共同的無情的「片狀」敵人幾件事情:

  • 更新到latest Protractor(目前4.0.0),這也帶來了最新的seleniumchromedriver
  • turn off Angular animations
  • 使用 browser.wait()與一套built-in or custom Expected Conditions。這可能是解決問題最可靠的方法。不幸的是,這是用例和問題特定的,你需要在有問題的地方修改你的實際測試。例如,如果你需要點擊一個元素,等待它可以點擊:

    var EC = protractor.ExpectedConditions; 
    var elm = $("#myid"); 
    
    browser.wait(EC.elementToBeClickable(elm), 5000); 
    elm.click(); 
    
  • 瀏覽器窗口最大化(避免隨機元素不可見或不可點擊錯誤)。把這個onPrepare():通過調整Control Flow

    browser.driver.manage().window().maximize(); 
    
  • 增加Protractor and Jasmine timeouts
  • slow Protractor down(不知道這是否適用於4.0.0,請測試)
  • 手動調用browser.waitForAngular();有問題的地方。我不知道爲什麼這會有所幫助,但我已經看到了報告,它肯定有助於解決片狀測試問題。
  • 在您的規格中使用jasmine done() callback。這可能有助於,例如,不啓動it()區塊,直到調用done爲止beforeEach()
  • return a promise from the onPrepare() function。這通常有助於確保事情爲測試運行做好準備
  • 使用protractor-flake package將自動重新運行失敗的測試。更像是一個快速的解決辦法的問題

還有其他特定問題的「招數」像slow typing into the text box,點擊via JavaScript

+0

謝謝。很高興知道我並不孤單。同時也非常感謝這些方便的提示! –

+0

如果你從未做過Flakey測試,那麼你就只有一人了......我們都想知道你是怎麼做到的:)非常好的總結@alecxe! – Brine

+0

當測試失敗時,這只是令人討厭的,大約有十分之一左右。你重新開始測試,它會起作用。這不是我所說的決定論。 –

1

這是我的經驗是一些方法(如sendKeys())做在controlFlow()隊列中並不總是在預期的時間點火,並且會導致測試失敗。我通過專門將它們添加到controlFlow()來解決此問題。例如:

this.enterText = function(input, text) { 
    return browser.controlFlow().execute(function() { 
     input.sendKeys(text); 
    }); 
}; 
1

,我的團隊一直使用一種解決方法是重新運行使用插件protractor-errors唯一失敗的測試。使用這個工具,我們可以在2-3次運行中發現真正的失敗與Flakey測試。要添加插件,只需添加一個需要聲明量角器配置的onPrepare功能的底部:

exports.config = { 
    ... 

    onPrepare: function() { 
     require('protractor-errors'); 
    } 
} 

您將需要通過這些額外的參數時,用插件運行測試:

protractor config.js --params.errorsPath 'jasmineReports' --params.currentTime (timestamp) --params.errorRun (true or false) 

如果你沒有簡單的方法傳入時間戳,還有一個cli工具可以處理生成currentTime。