2016-07-26 13 views
9

Ich verwalte eine komplexe Angular (1.5.x) Anwendung, die E2E getestet wird, unter Verwendung von Protractor (2.5.x). Ich habe ein Problem mit diesem Ansatz, der sich hauptsächlich in der Art darstellt, wie die Tests flockig wirken. Tests, die in einer Pull-Anforderung einwandfrei funktionierten, scheiterten in einer anderen. Dies betrifft einfache Locators wie zB.linkTest (...). Ich habe die fehlerhaften Tests überprüft und die App befindet sich auf der richtigen Seite, die Links sind vorhanden und verfügbar.Progractor flakiness

Hat jemand andere diese Konsistenzprobleme erlebt? Kennt man eine Ursache oder einen Workaround?

Antwort

2

Ja, ich glaube, wir alle haben so ein Problem mit der Flickerei erlebt.

Eigentlich ist die Blödheit ziemlich häufig Problem mit jedem Browser-Automatisierungs-Tool. Dies sollte jedoch im Fall des Winkelmessers weniger sein, da der Winkelmesser eine integrierte Wartefunktion hat, die erst nach dem richtigen Laden der Funktionen ausgeführt wird. In einigen Fällen müssen Sie jedoch einige explizite Wartezeiten verwenden, wenn zeitweise Fehler auftreten.

ziehe ich wie einige intelligente Warte Methoden zu verwenden:

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

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

Wo 2000 ms als Timeout verwendet wird, können Sie es konfigurierbar machen ein variable.Sometimes mit I mit browser.sleep() gehen auch wenn keiner meiner intelligenten Warte funktioniert.

9

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

Das heißt, hier sind die wenigen Dinge, die Sie tun können, unsere gemeinsamen gnadenlos „flakiness“ Feind zu bekämpfen:

  • Update auf die latest Protractor (derzeit 4.0.0), die auch bringt neueste selenium und chromedriver mit ihm
  • turn off Angular animations
  • Verwendung Drachen browser.wait() mit einer Reihe von built-in or custom Expected Conditions. Dies ist wahrscheinlich der zuverlässigste Weg, um das Problem anzugehen. Leider ist dies anwendungs- und problemspezifisch, Sie müssten Ihre eigentlichen Tests an den problematischen Stellen modifizieren. Zum Beispiel, wenn Sie ein Element klicken müssen, warten, bis es anklickbar sein:

    var EC = protractor.ExpectedConditions; 
    var elm = $("#myid"); 
    
    browser.wait(EC.elementToBeClickable(elm), 5000); 
    elm.click(); 
    
  • die Browser-Fenster maximieren (um zufälliges Element nicht sichtbar oder nicht anklickbar Fehler zu vermeiden). Setzen Sie diese auf onPrepare():

    browser.driver.manage().window().maximize(); 
    
  • Erhöhung der Protractor and Jasmine timeouts
  • slow Protractor down durch die Control Flow Tweaking (nicht sicher, ob es für 4.0.0 funktioniert, testen Sie bitte)
  • manuell browser.waitForAngular(); in problematischen Stellen nennen. Ich bin nicht sicher, warum das hilft, aber ich habe Berichte gesehen, wo es definitiv geholfen hat, einen flockigen Test zu reparieren.
  • Verwenden Sie die jasmine done() callback in Ihren Spezifikationen. Dies kann zum Beispiel dazu beitragen, den it()-Block nicht zu starten, bis beforeEach() aufgerufen wird.Dies hilft normalerweise sicherzustellen, dass die Dinge für den Testlauf vorbereitet werden
  • Verwenden Sie protractor-flake package, die automatisch fehlgeschlagene Tests erneut ausführen würde. Mehr wie eine schnelle Abhilfe für das Problem

Es gibt auch andere problemspezifische „Tricks“ wie slow typing into the text box, klicken via JavaScript usw.

+0

Danke. Es ist gut zu wissen, dass ich nicht alleine bin. Vielen Dank auch für die praktische Sammlung von Tipps! –

+0

Sie wären nur dann allein, wenn Sie nie Flocky-Tests hatten ... und wir würden alle wissen wollen, wie Sie es gemacht haben :) Sehr schöne Zusammenfassung @alecxe! – Brine

+0

Es ist einfach ärgerlich, wenn Tests zufällig, etwa 1 von 10 oder so versagen. Sie starten den Test neu und es funktioniert. Das nenne ich nicht Determinismus. –

1

Es ist meine Erfahrung gewesen ist, dass einige Methoden (zB. sendKeys()) tun nicht immer zur erwarteten Zeit, innerhalb der controlFlow() Warteschlange, und wird dazu führen, dass Tests flakey. Ich arbeite daran, indem ich sie speziell zu der controlFlow() hinzufüge. ZB:

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

Eine Abhilfe, die mein Team mit worden ist, nur nicht bestandene Tests erneut ausführen über das Plugin protractor-errors. Mit diesem Tool können wir echte Fehler im Vergleich zu Flakey-Tests innerhalb von 2-3 Läufen erkennen. Um das Plugin hinzufügen, fügen Sie einfach eine erfordern Anweisung an die Unterseite der onPrepare Funktion Protractor config:

exports.config = { 
    ... 

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

Sie müssen diese zusätzlichen Parameter übergeben, wenn Sie Ihre Tests mit dem Plugin auszuführen:

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

Es gibt auch ein cli-Tool, das das currentTime generiert, wenn Sie keine einfache Möglichkeit haben, einen Zeitstempel zu übergeben.