2012-05-31 15 views
12

Ho scritto il caso del selenio per PHP. Mi piacerebbe ottenere la copertura del codice mentre eseguo questi test case. La mia TestCase:Copertura del codice con PHPUnitSeleniumTestcase

<?php 
class Example extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php'; 

    protected function setUp() 
    { 
    $this->setBrowser("*firefox"); 
    $this->setBrowserUrl("http://applicationname"); 
    $this->setCollectCodeCoverageInformation(true); 
    $this->setTestId("10001"); 
    $this->setHost("applicationname"); 
    } 

    public function testMyTestCase() 
    { 
    $this->open("http://applicationame"); 
    $this->assertEquals("title", $this->getTitle()); 
    $this->type("id=ext-comp-1002", "testuser"); 
    $this->fireEvent("id=ext-comp-1002", "blur"); 
    $this->type("id=ext-comp-1003", "testpassword"); 
    $this->fireEvent("id=ext-comp-1003", "blur"); 
    $this->click("ext-gen45"); 
    $this->waitForPageToLoad("200000"); 
} 
} 
?> 

Ho seguito i passaggi riportati nel link "http://www.phpunit.de/manual/current/en/selenium.html"

Dopo aver eseguito il test sono non è in grado di trovare la copertura del codice. In phpunit_coverage.php, sembra cookie con il nome PHPUNIT_SELENIUM_TEST_ID. Questo cookie è stato creato in Driver.php e vedo che il cookie è disponibile, ma ha il nome host da impostare su "localhost" piuttosto che sul nome della mia applicazione.

Tempo di vita del cookie impostato sessione, ovvero immediatamente dopo l'esecuzione del test case questo cookie non sarà più disponibile e quando provo a lanciare phpunit_coverage.php, non è possibile trovare il cookie e le informazioni in modo che non venga visualizzata alcuna copertura del codice.

Le cose che non capisco:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. Se il cookie ha ha host diverso diversa applicazione può essere accessibile questo cookie

Ho visto questo problema in discussione in molti forum, ma uno ha dato una risposta concreta

Molti forum suggeriscono di utilizzare localhost anziché 127.0.0.1 come nome del server. Nel mio caso è già localhost.

Qualsiasi suggerimento a questo proposito sarà utile.

Grazie, Ravuri

+1

Forse le risposte a queste domande potrebbero offrire un aiuto: http://stackoverflow.com/questions/11270527/does-phpunit-selenium-code-coverage-work – Potherca

risposta

2

integrazione o test funzionali con selenio non coprono il codice in quanto stanno coprendo il comportamento. I report sulla copertura del codice per test come questo non generano alcun tipo di informazione utile. I test unitari genereranno rapporti di copertura del codice molto più significativi. I test vengono eseguiti sulla base delle informazioni fornite da e verso Selenium, in realtà non testano il tuo "codice" per così dire.

1

Penso che la risposta di frosty potrebbe essere resa ancora più forte, ma sono un noob totale con PHPUnit e Selenium che non sono completamente sicuro di quello che sto dicendo. Quindi lo dirò e vedrò se vengo corretto.

Le unit test esercitano il codice dell'applicazione sotto il controllo diretto di PHPUnit. Dai a PHPUnit il metodo nel tuo codice da richiamare e invoca quel metodo sotto Xdebug per raccogliere le informazioni sulla copertura. Penso che il tuo codice sia in esecuzione nello stesso spazio degli indirizzi di PHPUnit, anche se ciò potrebbe non essere strettamente vero - qualcuno sa se lo è?

Con i test eseguiti in Selenium, il codice non è direttamente sotto il controllo di PHPUnit. Invece di un metodo nel codice, si dà a PHPUnit un URL e si organizza per alimentare quell'URL a un browser Web reale. Non è necessario che il browser Web sia in esecuzione sullo stesso computer host di PHPUnit; e anche se lo è, il codice dell'applicazione in prova viene eseguito sul server Web designato dall'URL. In nessun modo PHPUnit può dire a Firefox di dire al server che gestisce una richiesta che se la gestione della richiesta richiama PHP, allora esegui quel codice PHP sotto Xdebug e invia l'output di traccia indietro insieme alla risposta! PHPUnit riceve solo l'URL specificato e l'output dal browser Web che ha servito la richiesta.Non ha modo di scoprire quale codice sia effettivamente eseguito dal server web che gestisce la richiesta.

Allora, dove la risposta precedente, ha detto che i rapporti di copertura del codice per questi test non avrebbero fornire informazioni utili, e che i test di unità sarebbero generare rapporti più significativi, mi piacerebbe andare tutto il modo per dire che non è possibile per questi test per misurare la copertura del codice, quindi non dovresti chiedere i rapporti sulla copertura del codice quando li esegui! O piuttosto che se si generano report di copertura del codice per i test sul selenio, e i report dicono che anche una sola riga del codice è stata eseguita, allora qualcosa è seriamente sbagliato nella configurazione.

+0

Non so se userei il termine " sotto il controllo "di PHPUnit, perché il codice in entrambi i casi viene eseguito da PHPUnit. La differenza, almeno nella mia mente, è che esistono test unitari per testare ogni singola unità di codice in solitudine; mentre i test di tipo Selenium riguardano l'integrazione di più unità di codice. In questi casi la copertura del codice non ti dice nulla ... – frosty

+0

Secondo tentativo: Per me, "eseguito da" è coerente con i test delle unità, in cui l'interprete PHP che sta interpretando la sorgente PHPUnit sta effettuando una chiamata in un metodo in il tuo codice sorgente Per esempio. il meccanismo di test delle unità in PHPUnit può catturare un'eccezione non gestita generata dal metodo testato. Ma nei test Selenium, il tuo codice viene eseguito con altri mezzi e non è nemmeno necessario che sia scritto in PHP. I test eseguiti tramite selenio non possono rilevare le eccezioni generate dall'applicazione, possono solo vedere quale effetto potrebbe avere l'eccezione sull'output del browser. Per me è molto diverso. – sootsnoot

+0

Non ho letto il link di @Potherca in una nota alla domanda originale. Non cambia il modo in cui penso "sotto controllo di" o "eseguito da". Ma fa notare che se si ha il controllo sul server web che esegue il codice in fase di test, è * possibile * renderlo copertura record per i test eseguiti su quel server web attraverso il selenio, in modo tale che siano inclusi nel report di copertura. Penso che sia fantastico! Mentre sono d'accordo con gelido che ottenere una buona copertura attraverso i test unitari sia più prezioso/significativo, la copertura attraverso i test del selenio non è inutile - ho pensato che non fosse possibile! – sootsnoot