2012-05-31 38 views
12

He escrito Selenium Test case para PHP. Me gustaría obtener la cobertura del código mientras ejecuto estos casos de prueba. Mi caso de prueba:Cobertura del código 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"); 
} 
} 
?> 

He seguido los pasos mencionados en el enlace "http://www.phpunit.de/manual/current/en/selenium.html"

Después de ejecutar la prueba Soy no puede encontrar la cobertura del código. En phpunit_coverage.php, está buscando cookies con el nombre PHPUNIT_SELENIUM_TEST_ID. Esta cookie se está creando en Driver.php y veo que la cookie está disponible, pero tiene un nombre de host para establecer en "localhost" en lugar de mi nombre de aplicación.

El tiempo de vida de la cookie se establece sesión, es decir, inmediatamente después de la ejecución del caso de prueba esta cookie ya no estará disponible y cuando intento iniciar phpunit_coverage.php, no puede encontrar la cookie y la información para que no aparezca la cobertura del código.

cosas que no entiendo:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. Si la cookie tiene tiene diferentes host mas que la aplicación puede ser accesible esta cookie

he visto este problema se discute en muchos foros, pero uno dio una respuesta concreta

Muchos foros sugirieron usar localhost en lugar de 127.0.0.1 como nombre del servidor. En mi caso, ya es localhost.

Cualquier sugerencia a este respecto será útil.

Gracias, Ravuri

+1

Quizás las respuestas a estas preguntas puedan ofrecer alguna ayuda: http://stackoverflow.com/questions/11270527/does-phpunit-selenium-code-coverage-work – Potherca

Respuesta

2

integración o pruebas funcionales con selenio no están cubriendo código en la medida en que están cubriendo el comportamiento. Los informes de cobertura de código para pruebas como esta no van a generar ningún tipo de información útil. Las pruebas unitarias generarán informes de cobertura de código mucho más significativos. Las pruebas se están ejecutando en función de la información proporcionada por y desde Selenium, en realidad no está probando su "código", por así decirlo.

1

Creo que la respuesta de Frosty podría ser aún más fuerte, pero soy un novato total tanto con PHPUnit como con Selenium que no estoy completamente seguro de lo que estoy diciendo. Entonces lo diré y veré si me corrigen.

Pruebas unitarias ejercite su código de aplicación bajo el control directo de PHPUnit. Le da a PHPUnit el método en su código para invocar, e invoca ese método bajo Xdebug para recopilar la información de cobertura. Creo que tiene su código ejecutándose en el mismo espacio de direcciones que PHPUnit, aunque eso no sea estrictamente cierto. ¿Alguien sabe si es así?

Con las pruebas ejecutadas bajo Selenium, su código no está directamente bajo el control de PHPUnit. En lugar de un método en su código, le da a PHPUnit una URL, y arregla para alimentar esa URL a un navegador web real. El navegador web en sí no necesita ejecutarse en el mismo equipo host que PHPUnit; e incluso si lo es, su código de aplicación que se está probando se ejecuta en el servidor web designado por la URL. No es posible PHPUnit le puede decir a Firefox que le diga al servidor que maneja una solicitud que si maneja la solicitud invoca PHP, luego ejecute ese código PHP bajo Xdebug y envíe la salida de rastreo junto con la respuesta. PHPUnit solo puede ver la URL que especificó y la salida del navegador web que atendió la solicitud.No tiene forma de averiguar qué código realmente ejecutó el servidor web que maneja la solicitud.

Entonces, ¿dónde la respuesta anterior dijo que los informes de cobertura de código para estas pruebas no proporcionarían información útil, y que las pruebas unitarias generarían informes más significativos, me gustaría ir todo el camino que decir que no es posible para que estas pruebas midan la cobertura del código, por lo que no debe solicitar informes de cobertura del código cuando las ejecuta. O mejor dicho, si genera informes de cobertura de código para pruebas de selenio, y los informes dicen que incluso una línea de su código se ejecutó, entonces algo está muy mal con su configuración.

+0

No sé si utilizaría el término " bajo el control "de PHPUnit, porque el código en ambos casos está siendo ejecutado por PHPUnit. La diferencia, al menos en mi opinión, es que porque existen pruebas unitarias para probar cada unidad individual de código en reclusión; mientras que las pruebas de tipo Selenium se ocupan de la integración de múltiples unidades de código. En esos casos, la cobertura del código realmente no dice nada ... – frosty

+0

Segundo intento: para mí, "ejecutado por" es consistente con pruebas unitarias, donde el intérprete de php que está interpretando la fuente PHPUnit está haciendo una llamada a un método en su código fuente P.ej. el mecanismo de prueba de unidades en PHPUnit puede detectar una excepción no controlada lanzada por el método que se está probando. Pero en las pruebas de Selenium, su código se está ejecutando de otra manera, y ni siquiera es necesario que esté escrito en PHP. Las pruebas ejecutadas a través de selenio no pueden detectar las excepciones lanzadas por su aplicación, solo pueden ver el efecto que la excepción podría haber tenido en la salida del navegador. Para mí, eso es muy diferente. – sootsnoot

+0

No había leído el enlace de @Potherca en una nota a la pregunta original. No cambia la forma en que pienso "bajo control de" o "ejecutado por". Pero sí señala que si tiene control sobre el servidor web que ejecuta el código que se está probando, * es * posible hacer que registre la cobertura de las pruebas ejecutadas en ese servidor web a través de selenio, de modo que estén incluidas en el informe de cobertura. ¡Creo que es increíble! Aunque estoy de acuerdo con la frialdad de que obtener una buena cobertura mediante pruebas unitarias es más valioso/significativo, la cobertura a través de las pruebas de selenio no es inútil, ¡simplemente pensé que no era posible! – sootsnoot

Cuestiones relacionadas