2012-05-31 23 views
12

Ich habe Selenium Testfall für PHP geschrieben. Ich möchte die Codeabdeckung während der Ausführung dieser Testfälle erhalten. Mein Testfall:Code Coverage mit 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"); 
} 
} 
?> 

ich die Schritte in den Link erwähnt gefolgt sind „http://www.phpunit.de/manual/current/en/selenium.html“

Nach Durchführung des Tests ich bin nicht in der Lage, die Codeabdeckung zu finden. In phpunit_coverage.php sucht es Cookie mit dem Namen PHPUNIT_SELENIUM_TEST_ID. Dieser Cookie wird in Driver.php erstellt und ich sehe, dass ein Cookie verfügbar ist, aber der Hostname muss auf "localhost" und nicht auf meinen Anwendungsnamen eingestellt sein.

Cookie-Lebenszeit ist gesetzt Sitzung, d. H. Bedeutet sofort nach Testfall Ausführung dieser Cookie nicht mehr verfügbar und wenn ich versuche, phpunit_coverage.php zu starten, ist es nicht in der Lage, den Cookie und Informationen zu finden, so dass keine Codeabdeckung erscheint.

Dinge, die ich nicht verstehe:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. Wenn das Cookie hat unterschiedliche Host andere als Anwendung dieses Cookie kann

ich gesehen habe, dieses Problem in zugänglich sein diskutiert viele Foren, aber eine gab konkrete Antwort

Viele Foren vorgeschlagen, localhost anstelle vonzu verwendenals Servername. In meinem Fall ist es bereits localhost.

Jeder diesbezügliche Vorschlag ist hilfreich.

Danke, Ravuri

+1

Vielleicht Antworten auf diese Fragen bieten möglicherweise Hilfe: http://StackOverflow.com/Questions/11270527/does-phunitat-selenium-code-coverage-work – Potherca

Antwort

2

Integration oder Funktionstests mit Selen decken Code nicht da sie das Verhalten abdeckt sind. Code-Coverage-Berichte für solche Tests generieren keine nützlichen Informationen. Komponententests generieren viel aussagekräftigere Code Coverage-Berichte. Die Tests werden auf der Grundlage von Informationen ausgeführt, die von und zu Selenium bereitgestellt werden. Es testet Ihren "Code" also nicht sozusagen.

1

Ich denke, Frosty's Antwort könnte noch stärker gemacht werden, aber ich bin so ein totaler Noob mit PHPUnit und Selen, dass ich nicht ganz sicher bin, was ich sage. Also werde ich es sagen und sehen, ob ich korrigiert werde.

Komponententests üben Ihren Anwendungscode unter direkter Kontrolle von PHPUnit aus. Sie geben PHPUnit die Methode in Ihrem Code zum Aufrufen und ruft diese Methode unter Xdebug auf, um die Coverage-Informationen zu sammeln. Ich denke daran, dass Ihr Code im gleichen Adressraum wie PHPUnit läuft, auch wenn das nicht unbedingt stimmt - weiß jemand, ob es das ist?

Mit Tests unter Selenium läuft Ihr Code nicht direkt unter der Kontrolle von PHPUnit. Anstelle einer Methode in Ihrem Code geben Sie PHPUnit eine URL und ordnen diese URL einem echten Webbrowser zu. Der Webbrowser selbst muss nicht auf demselben Host-Rechner wie PHPUnit laufen; und selbst wenn dies der Fall ist, wird der getestete Anwendungscode auf dem Webserver ausgeführt, der durch die URL gekennzeichnet ist. Es gibt keine Möglichkeit, dass PHPUnit Firefox anweisen kann, dem Server mitzuteilen, dass bei der Bearbeitung der Anfrage PHP aufgerufen wird. Führen Sie dann diesen PHP-Code unter Xdebug aus und senden Sie die Trace-Ausgabe zusammen mit der Antwort zurück! PHPUnit kann nur die von Ihnen angegebene URL und die Ausgabe des Webbrowsers sehen, der die Anfrage bearbeitet hat.Es gibt keine Möglichkeit herauszufinden, welchen Code der Webserver, der die Anfrage bearbeitet, tatsächlich ausgeführt hat.

Also, wo die vorherige Antwort, die abdeckenden Code die Berichte für diese Tests nicht alle notwendigen Informationen zur Verfügung stellen würde, und dass Unit-Tests aussagekräftiger Berichte erzeugen würde, würde ich den ganzen Weg gehen zu sagen, dass es nicht möglich ist für diese Tests, um Codeabdeckung überhaupt zu messen, also sollten Sie Code-Abdeckungsberichte nicht verlangen, wenn Sie sie laufen lassen! Oder eher, wenn Sie Code-Coverage-Berichte für Selentests generieren und die Berichte sagen, dass sogar eine Zeile Ihres Codes ausgeführt wurde, dann ist etwas ernsthaft falsch mit Ihrer Einrichtung.

+0

Ich weiß nicht, ob ich den Begriff verwenden würde " unter der Kontrolle von PHPUnit, weil der Code in beiden Fällen von PHPUnit ausgeführt wird. Der Unterschied besteht zumindest darin, dass Unit-Tests existieren, um jede einzelne Code-Einheit in Abgeschiedenheit zu testen; Selen-Typ-Tests befassen sich mit der Integration mehrerer Code-Einheiten. In diesen Fällen sagt Code Coverage nichts wirklich ... – frosty

+0

Zweiter Versuch: Für mich ist "executed by" konsistent mit Komponententests, wo der PHP-Interpreter, der die PHPUnit-Quelle interpretiert, einen Aufruf in eine Methode macht Dein Quellcode. Z.B. Der Einheitentestmechanismus in PHPUnit kann eine unbehandelte Ausnahme auffangen, die von der getesteten Methode ausgelöst wird. Aber in Selenium-Tests wird Ihr Code auf andere Weise ausgeführt und muss nicht einmal in PHP geschrieben werden. Tests, die über Selen ausgeführt werden, können keine Exceptions auslösen, die von Ihrer Anwendung ausgelöst werden. Sie können nur sehen, welchen Effekt die Exception auf die Browserausgabe hatte. Das ist für mich sehr anders. – sootsnoot

+0

Ich hatte den Link von @Potherca in einer Notiz zur ursprünglichen Frage nicht gelesen. Es ändert nichts daran, wie ich "unter Kontrolle" oder "ausgeführt von" denke. Es wird jedoch darauf hingewiesen, dass es möglich ist, wenn Sie die Kontrolle über den Webserver haben, der den getesteten Code ausführt, die Abdeckung für Tests aufzuzeichnen, die auf diesem Webserver über Selenium ausgeführt werden, sodass sie in den Abdeckungsbericht aufgenommen werden. Ich denke, das ist genial! Während ich mit frostig zustimme, dass eine gute Abdeckung durch Komponententests wertvoller/aussagekräftiger ist, ist die Abdeckung durch Selentests nicht wertlos - ich dachte nur, dass es nicht möglich war! – sootsnoot