2012-10-02 10 views
5

Ho scritto un test case con estensione PHPUnit Selenium2TestCase. Funziona bene, ma non riesco a capire come eseguire automaticamente questo test su vari browser.PHPUnit estensione Selenium 2 (webdriver) e più browser

C'è un metodo setBrowser() che funziona solo nel metodo setUp(). Ho pensato a qualcosa del genere:

/** 
* @dataProvider browsers 
*/ 
public function loginTest($browser) { 
    $this->setBrowser($browser); 
    // tests... 
} 

Ma io non lavoro. Prova a eseguire il browser predefinito (Probabilmente ho un piccolo casino con Safari, l'ultima volta usa firefox)

RuntimeException: Safari could not be found in the path! 
Please add the directory containing ''Safari'' to your PATH environment 
variable, or explicitly specify a path to Safari like this: 
*safari /blah/blah/Safari 

PS. SeleniumTestCase (non basato sul webdriver) fornisce una configurazione xml dove possiamo specificare i browser. Selenium2TestCase non lo supporta.

Qualsiasi suggerimento è benvenuto. Grazie. Marcin

risposta

2

La correzione per questo dipende realmente dal tipo di file di dati. Se potessi postare potremmo aiutarti di più.

Per il momento sto assumendo poiché phpunit per natura è un framework di test unitario alla volta che non si sta tentando di eseguire più browser contemporaneamente, ma si vuole solo riservare l'opzione per cambiare i browser come tu ritieni opportuno

Hai ragione che dovresti utilizzare setBrowser in setUp. Quando eseguito, PHPUnit eseguirà sempre setUp per primo e tearDown() per ultimo. Una buona pratica qui è quella di creare la propria classe di unit test-test personalizzata in cui è possibile personalizzare questi metodi.

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase { 
    public $browser = "firefox"; 
    public function setUp() { 
     $this->setBrowser("*".$browser); 
    } 
} 

Ora, quando si sta scrivendo un test di estendere la classe di test personali e impostare il browser di conseguenza

class newTest extends customUnitTest { 
    $this->browser = "safari"; 
    public function testBlah { 
     blah blah... 
    } 
} 

setUp verrà eseguito durante l'esecuzione, e tirerà nella variabile browser. Per impostazione predefinita otterrete Firefox ma se alcuni test sono stati testati in modo più appropriato su altri browser avete questa opzione.

Se si desidera poter modificare tutti i browser contemporaneamente in tutti i test, è necessario valutare l'assegnazione del valore del browser in base a una variabile di ambiente.

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase { 
    try { 
     public $browser = getenv("SELENIUM_BROWSER"); 
    } catch (Exception $e) { 
     public $browser = "firefox"; 
    } 
    public function setUp() { 
     $this->setBrowser("*".$browser); 
    } 
} 

Con questa impostazione si può cambiare il browser per ogni prova che non è hard-coded il browser in sé modificando l'SELENIUM_BROWSER variabile di ambiente. In questo modo possiamo eseguire lo stesso codice su server diversi con diversi browser predefiniti senza dover riscrivere nulla.

Si noti che l'ereditarietà multipla non è una buona pratica. Può portare a un codice fragile e persino a minacce alla sicurezza se non si impostano correttamente metodi/variabili. Tuttavia in questo caso è utile perché possiamo definire i metodi del framework PHPUnit a nostro piacimento, e otteniamo tutti i metodi di base del selenio nel nostro test. Quindi, per eseguire un metodo predefinito selenio noi scrive appena

$this->open("www.google.com"); 

Questo è un metodo molto diverso da quello l'approccio generale di assegnare il selenio ad un oggetto, come il test si scrive è l'oggetto di selenio, ma sembra più php appropriata , soprattutto per questo caso d'uso.

+0

Bello, anche se getenv e l'eredità non sono soluzioni lisce. Comunque mostra ciò che posso fare. Grazie. PS. Spero che l'implementazione di Selenium2TestCase sia cambiata da quando ho scritto il problema ... o lo sarà. –

4

qualcosa di simile

class WebTestCase extends \application\components\test\ExWebTestCase 
    { 
     // default params 
     public $parameters = array(
      'host'       => 'localhost', 
      'port'       => 4444, 
      'seleniumServerRequestsTimeout' => 30000, 
      'timeout'      => 30000, 
    ); 

     // list of browsers with per-browserconfig 
     public static $browsers = array(
      array(
       'browserName' => 'firefox', 
     ), 
      array(
       'browserName' => 'chrome', 
     ), 
      array(
       'browserName' => 'safari', 
     ), 
      array(
       'browserName' => 'internet explorer', 
       'host' => 'some IP of VirtualBox with IE' 
     ) 
    ); 
    } 
2

per l'esecuzione in più di controllo del browser questo link:

http://phpunit.de/manual/current/en/selenium.html esempio 17,4 (phpunit 3.7) Se ur in esecuzione il testcase in localhost, utilizzare 'host' => 'localhost'. setBrowser() la funzione non è necessaria ..

+0

Per quanto mi ricordo, funziona per SeleniumTestCase non per Selenium2TestCase. –

1

Utilizzare l'utente deve la proprietà $ browser per la definizione di più browser, come definito sopra.