2013-06-24 9 views
5

Ho creato un semplice test di accesso in Behat per accedere alla nostra applicazione interna. Ci sono due tipi di login (fatti dalla stessa schermata e box). C'è di base e avanzato. L'unica differenza è che in avanzato l'utente che sta effettuando l'accesso ha accesso a più di una società e gli viene chiesto di scegliere un'azienda su cui lavorare.Durante l'esecuzione di un test di accesso Behat tramite PhantomJS, passa solo alla prima esecuzione

Trovo che ogni volta che eseguo gli scenari tramite PhantomJS anziché Selenium, vengono eseguiti molto più rapidamente (ovviamente poiché non è necessario eseguire il rendering in un emulatore browser senza testa). Quando lancio PhantomJS per la prima volta, esegue entrambi gli scenari bene. Ma poi lo eseguo una seconda volta e fallisce il primo scenario (il login di base).

Se riavvio PhantomJS, funziona di nuovo fino al secondo tentativo. Sono molto confuso da questo. Perché è necessario riavviare PhantomJS per far passare nuovamente entrambi i test alla prima chiamata.

Se si specifica che voglio solo che esegua l'accesso avanzato nelle esecuzioni successive, fallisce anche quell'accesso. Se si specifica l'accesso di base (impedendo comunque di eseguire entrambi gli scenari) fallisce anche questo. Ma quando eseguo entrambi gli scenari nella stessa chiamata, il primo fallisce sempre e il secondo passa sempre.

Ho persino commutato l'ordine in modo che base sia eseguita seconda invece che prima e il primo scenario (in questo caso avanzato) non riesce e il secondo passa. Quindi cosa sta succedendo nel mondo?

Come bonus extra sono andato avanti e ho aggiunto una riga che diceva "Allora seguo" Logout "" e all'improvviso entrambi gli scenari passano di nuovo. Il che avrebbe senso se non fosse per il fatto che funziona bene nel secondo scenario. Non dovrebbe fallire sia se è già registrato? C'è un modo per assicurarsi che la cache di PhantomJS sia deselezionata alla fine di ogni scenario?

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

Ho lo stesso problema in Codeception. PhantomJS continua sessione. – Adamamont

+0

Ho lo stesso problema, ma nel mio caso anche reset() non aiuta. – Pavel

risposta

9

Ok, ho finalmente capito questo pazzo. Almeno parzialmente. Sembra mantenere la sessione tra gli scenari. Questo non spiega completamente perché è solo la prima chiamata. Ma sospetto che PhantomJS stia mantenendo la sessione precedente aperta quando l'ultimo scenario si chiude e che Mink ricostruisce la sessione tra gli scenari, ma non dopo la fine dell'ultimo scenario.

In ogni caso, la soluzione è creare un contesto o un hook per reimpostare la sessione alla fine di ogni chiamata di scenario. A scopo di test, ho creato un contesto che recita "E resetto la sessione".

Ho definito questo come tale:

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

Quando chiamo tale contesto alla fine di entrambi gli scenari si risolve il problema. Quindi penso che andrò avanti e fare un hook post-scenario che si occupa di questo per me.

Problemi correlati