2011-03-31 6 views
6

He escrito anteriormente algunas pruebas de selenio usando ruby ​​/ rspec, y me pareció bastante poderoso. Ahora, estoy usando Selenium con PHPUnit, y me faltan algunas cosas, podría ser solo por falta de experiencia. En Ruby/RSpec, estoy acostumbrado a poder definir una configuración "global" para cada caso de prueba, donde, entre otras cosas, abro la ventana del navegador e inicio sesión en mi sitio.Secuencia del navegador en setUp(), tearDown(), no por instalación de testcase?

siento que PHPUnit es un poco escaso aquí, en que 1) es suficiente setUp() y tearDown(), que se ejecuta antes y después de cada prueba individual, y que 2), parece que la sesión de navegación actual se establece entre setUp() y la prueba, y cerró antes de tearDown().

Esto crea un poco más de desorden en las pruebas en sí, porque explícitamente tiene que abrir la página al principio y realizar limpiezas al final. En cada prueba individual. También parece una sobrecarga innecesaria cerrar y volver a abrir el navegador para cada prueba, en lugar de volver a la página de destino.

¿Hay alguna forma alternativa de lograr lo que estoy buscando?

+0

No estoy seguro si eso es lo que está buscando, pero PHPUnit no solo proporciona 'setup' y' tearDown' sino también un montón de otros métodos que se pueden usar para configurar el estado global de sus pruebas. Vea el capítulo sobre [Fixtures en el Manual de PHPUnit] (http://www.phpunit.de/manual/3.6/en/fixtures.html). Por favor aclare si esto es lo que está buscando o no. – Gordon

Respuesta

8

Lo que he hecho en el pasado es hacer un método protegido que devuelve un objeto para la sesión de este modo:

protected function initBrowserSession() { 
    if (!$this->browserSession) { 
     $this->setBrowser('*firefox'); 
     $this->setBrowserUrl('http://www.example.com/'); 
     //Initialize Session 
     $this->open('http://www.example.com/login.php'); 
     // Do whatever other setup you need here 
    } 
    $this->browserSession = true; 
} 

public function testSomePage() { 
    $this->initBrowserSession(); 
    //Perform your test here 
} 

Realmente no se puede utilizar el setupBefore/AfterClass funciones, ya que son estáticas (y como tal que no tendrás acceso a la instancia).

Ahora, dicho esto, cuestionaría su motivación para hacerlo. Al realizar una prueba que reutiliza una sesión entre pruebas, está introduciendo la posibilidad de tener efectos secundarios entre las pruebas. Al volver a abrir una nueva sesión para cada prueba, está aislando los efectos hasta el resultado de la prueba. ¿A quién le importa el rendimiento (al menos razonablemente) de reabrir el navegador? Hacerlo aumenta la validez de la prueba ya que está aislada. Por otra parte, podría haber algo que decir para probar una sesión prolongada. Pero si ese fuera el caso, lo convertiría en una prueba/clase de prueba separada para la prueba de funcionalidad individual ...

0

Aunque estoy de acuerdo con @ircmaxell en que sería mejor reiniciar la sesión entre pruebas, puedo ver el caso donde las pruebas pasarían de tomar minutos a tomar horas solo para reiniciar el navegador.

Por lo tanto, hice algunas búsquedas y descubrí que puede anular el método start() en una clase base. En mi configuración, tengo el siguiente:

<?php 
require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 

class SeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    public function setUp() { 
     parent::setUp(); 
     // Set browser, URL, etc. 
     $this->setBrowser('firefox'); 
     $this->setBrowserUrl('http://www.example.com'); 
    } 

    public function start() { 
     parent::start(); 
     // Perform any setup steps that depend on 
     // the browser session being started, like logging in/out 
    } 
} 

Esto afectará de forma automática cualquier clase que se extienden SeleniumTestCase, por lo que no tiene que preocuparse por la configuración del entorno en cada prueba individual.

No he probado, pero parece que también hay un método stop() llamado antes de tearDown().

Espero que esto ayude.

Cuestiones relacionadas