2013-06-24 9 views
5

Ich habe einen sehr einfachen Login-Test in Behat erstellt, um sich in unsere interne Anwendung einzuloggen. Es gibt zwei Login-Typen (aus demselben Bildschirm und derselben Box). Es gibt grundlegende und fortgeschrittene. Der einzige Unterschied besteht darin, dass der Benutzer, der sich anmeldet, Zugriff auf mehr als ein Unternehmen hat und aufgefordert wird, ein Unternehmen für die Arbeit auszuwählen.Wenn ich einen Behat-Login-Test über PhantomJS durchführe, gibt es nur den ersten Durchlauf aus

Ich finde, dass wenn ich die Szenarien durch PhantomJS anstelle von Selenium laufen sie viel schneller laufen (natürlich, da nichts in einem kopflosen Browser-Emulator gerendert werden muss). Wenn ich PhantomJS zum ersten Mal starte, laufen beide Szenarien gut. Aber dann laufe ich es ein zweites Mal und es versagt das erste Szenario (das Basis-Login).

Wenn ich PhantomJS neu starte, funktioniert es bis zum zweiten Versuch wieder. Ich bin sehr verwirrt. Warum muss PhantomJS neu gestartet werden, damit beide Tests beim ersten Aufruf erneut durchgeführt werden?

Wenn ich festlege, dass ich nur möchte, dass die erweiterte Anmeldung bei nachfolgenden Läufen ausgeführt wird, schlägt auch diese Anmeldung fehl. Wenn ich die Basis-Anmeldung festlege (und trotzdem die Ausführung beider Szenarien verhindert), schlägt dies ebenfalls fehl. Aber wenn ich beide Szenarien im selben Call laufe, scheitert die erste immer und die zweite passiert immer.

Ich habe sogar die Reihenfolge gewechselt, so dass Basic zweiten statt ersten ausgeführt wird und das erste Szenario (in diesem Fall erweitert) fehlschlägt und die zweite passiert. Was passiert also auf der Welt?

Als zusätzlichen Bonus ging ich weiter und fügte eine Zeile hinzu, die lautet: "Dann folge ich" Log Out "" und plötzlich passieren beide Szenarien wieder. Was wäre sinnvoll, wenn es im zweiten Szenario nicht gut läuft. Sollte es nicht scheitern, wenn es bereits eingeloggt ist? Gibt es eine Möglichkeit sicherzustellen, dass der Cache für PhantomJS am Ende jedes Szenarios gelöscht wird?

Feature: Login 
    Login to app using a basic user 
    Login to app using a multi-company user 

    @javascript 
    Scenario: Basic Login 
     Given I am on "/" 
     And I wait a few seconds 
     When I fill in "login" with "ijones" 
     And I fill in "password" with "[email protected]" 
     And I press "LoginButton" 
     And I wait a few seconds 
     Then I should see "By clicking below" 
     And I press "OK" 
     Then I should see "Welcome" 

    @javascript 
    Scenario: Advanced Login 
     Given I am on "/" 
     When I fill in "login" with "rtyler" 
     And I fill in "password" with "[email protected]" 
     And I press "LoginButton" 
     Then I wait for the company selection box 
     And I click a field "company" 
     And I pick "Test Company 2" 
     And I press "CompanyLoginButton" 
     Then I should see "By clicking below" 
     And I press "OK" 
     Then I should see "Welcome" 
+0

Ich habe das gleiche Problem in Codeception. PhantomJS behalten Sitzung. – Adamamont

+0

Ich habe das gleiche Problem, aber in meinem Fall hilft sogar Reset() nicht. – Pavel

Antwort

9

Ok, endlich habe ich diesen Schwachkopf herausgefunden. Wenigstens teilweise. Es scheint, die Sitzung zwischen den Szenarien zu halten. Dies erklärt nicht vollständig, warum es nur der erste Anruf ist. Aber ich vermute, dass PhantomJS die vorherige Sitzung geöffnet hält, wenn das letzte Szenario geschlossen wird, und dass Mink die Sitzung zwischen den Szenarien neu erstellt, aber nicht nach dem Ende des letzten Szenarios.

Wie auch immer, die Lösung besteht darin, einen Kontext oder einen Hook zu erstellen, um die Sitzung am Ende jedes Szenarioaufrufs zurückzusetzen. Zu Testzwecken habe ich einen Kontext erstellt, der lautet "Und ich habe die Sitzung zurückgesetzt".

I definiert diese als solche:

/** 
* @Given /^I reset the session$/ 
*/ 
public function iResetTheSession() { 
    $this->getSession()->reset(); 
} 

Als ich diesen Zusammenhang am Ende der beiden Szenarien nennen es das Problem behebt. Also denke ich, dass ich einen Post-Szenario-Haken machen werde, der das für mich erledigt.