2011-01-11 17 views
3

Ich bin neu in PHPUnit, und ich bin mit einigen Schwierigkeiten Einheit HTML-Ausgabe testen.Wie Testen der HTML-Ausgabe mit PHPUnit?

Mein Test ist die folgende:

/** 
* @covers Scrap::removeTags 
* 
*/ 
public function testRemoveTags() { 

    // Variables 
    $simple_parameter  = 'script'; 
    $array_parameter   = array('script', 'div'); 
    $html     = '<div class="pubanunciomrec" style="background:#FFFFFF;"><script type="text/javascript"><!-- google_ad_slot = "9853257829"; google_ad_width = 300; google_ad_height = 250; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></div><table></table>'; 

    // Expected HTML 
    $expected_html_whitout_script  = new DOMDocument; 
    $expected_html_whitout_script->loadHTML('<div class="pubanunciomrec" style="background:#FFFFFF;"></div><table></table>'); 
    $expected_html_without_script_div = new DOMDocument; 
    $expected_html_without_script_div->loadHTML('<table></table>'); 

    // Actual HTML 
    $actual_whitout_script  = new DOMDocument; 
    $actual_whitout_script->loadHTML($this->scrap->removeTags($html, $simple_parameter)); 
    $actual_without_script_div = new DOMDocument; 
    $actual_without_script_div->loadHTML($this->scrap->removeTags($html, $array_parameter)); 


    // Test 
    $this->assertEquals($expected_html_whitout_script, $actual_whitout_script); 
    $this->assertEquals($expected_html_without_script_div, $actual_without_script_div); 

} 

Mein Problem ist, dass das Objekt DOMDocument einig HTML-Code erzeugt, und ich kann nicht vergleichen. Wie kann ich das DOMDocument-Objekt drucken, um die Ausgabe zu sehen? Irgendwelche Hinweise, wie man HTML vergleicht?

Sorry mein schlechtes Englisch.

Mit besten Grüßen,

+0

ich von Ihnen über das Gerät zu testen einige Führer brauchen. werden Sie bitte wissen, wie Sie den Komponententest für eine Webanwendung starten. Was ist der Ausgang nach dem Komponententest? –

Antwort

1

Sie saveHtml Methode des DOMDocument verwenden können und die Ausgabe vergleichen.

+0

Danke für die Antwort. Es hat mein Problem gelöst. Mit freundlichen Grüßen, –

1

Sie können sich überlegen, sich Selenium anzusehen. Es ist ein browserbasiertes Testwerkzeug, um Funktionstests für eine Website durchzuführen.

Sie schreiben Skripts, die das Laden eines Webbrowsers und das Simulieren von Klicks und anderen Aktionen umfassen, und dann die Überprüfung, ob bestimmte Seitenelemente vorhanden sind, am richtigen Ort oder mit den erwarteten Werten.

Die Tests können mit einer IDE geschrieben werden, die als Plug-In für Firefox ausgeführt wird, aber sie kann mit allen gängigen Browsern ausgeführt werden.

Wir haben eine Reihe von Selenium-Tests, die als Teil unseres CI-Prozesses ausgeführt werden, so dass wir sehr schnell sehen können, ob etwas mit unserer HTML-Ausgabe schief gelaufen ist.

Alles in allem ist es ein sehr leistungsfähiges Testwerkzeug.

Auch es integriert sich mit PHPUnit (und anderen sprachspezifischen Tools), so dass es Ihre Frage beantwortet, obwohl wahrscheinlich nicht in der Art, wie Sie dachten.

+1

Problem bei der Verwendung von Selen ist die Durchführung der Testausführung. Wenn Sie die Benutzerinteraktion nicht testen müssen, ist es viel schneller, HTML oder ähnliche Techniken zu vergleichen. Am Anfang spürst du das nicht, aber nach einer Weile beginnt ihre Langsamkeit dich zu schleifen. – ivanjovanovic

4

Ende 2013 gibt es eine andere Möglichkeit, die HTML-Ausgabe mit PHPUnit zu testen. Es verwendet assertTag() -Methode, die in PHPUnit 3.7 und 3.8 gefunden werden kann.

Zum Beispiel:

// Matcher that asserts that there is an element with an id="my_id". 
$matcher = array('id' => 'my_id'); 

// Matcher that asserts that there is a "span" tag. 
$matcher = array('tag' => 'span'); 

// Matcher that asserts that there is a "div", with an "ul" ancestor and a "li" 
// parent (with class="enum"), and containing a "span" descendant that contains 
// an element with id="my_test" and the text "Hello World". 
$matcher = array(
    'tag'  => 'div', 
    'ancestor' => array('tag' => 'ul'), 
    'parent' => array(
     'tag'  => 'li', 
     'attributes' => array('class' => 'enum') 
    ), 
    'descendant' => array(
     'tag' => 'span', 
     'child' => array(
      'id'  => 'my_test', 
      'content' => 'Hello World' 
     ) 
    ) 
); 

// Use assertTag() to apply a $matcher to a piece of $html. 
$this->assertTag($matcher, $html); 

Lesen Sie mehr in der offiziellen PHPUnit Website.

+1

'assertTag' wurde in der Version 4.2 (aktueller Stable ist 4.6) aufgrund von ausstehenden Fehlern und einer allgemeinen schlechten Implementierung veraltet (https://github.com/sebastianbergmann/phpunit/issues/1292). Dieser Fehlerdialog verweist auf eine in Bearbeitung befindliche PHPUnit-Erweiterung, die versucht, die Funktionalität zu ersetzen. –

2

Sie sollten beim Vergleichen von ausgegebenem HTML mit einer korrekten Vorlage vorsichtig sein. Ihr HTML wird sich sehr ändern und Sie können am Ende zu viel Zeit damit verbringen, Ihre Tests zu warten.

Siehe diesen Beitrag für an alternative approach.

0

Sie können zwei HTML-Strings mit PHPUnit assertXmlStringEqualsXmlString Methode vergleichen:

$this->assertXmlStringEqualsXmlString($emailMarkup, $html); 

wo $emailMarkup - erwartet HTML-String $html - aktuelle HTML-String

Wichtig! HTML-Strings müssen XML-gültig sein.Zum Beispiel

<br/>

statt

<br>

Auch Attribute verwenden Variablenwerte haben müssen, zum Beispiel verwenden

<hr noshade="true">

statt

<hr noshade>