PHPUnit che asserisce una struttura HTML identica indipendentemente dagli spazi bianchi

Ho uno script da riga di comando che genera un codice HTML che sto cercando di testare unitamente usando PHPUnit. Nota che questo HTML non è visto da un browser , quindi Selenium non è la soluzione giusta per questo.

Mi preoccupo solo di confrontare la struttura HTML effettiva. Sto usando assertEquals() ma le strings reali potrebbero non essere esattamente identiche a causa di vari caratteri di spaziatura.

 public function testHtmlIsIdentical() { $expectedReport = file_get_contents('expected.html'); $this->report->setupSomeData('test data'); $actualReport = $this->report->generateHtml(); $this->assertEquals($expectedReport, $actualReport); } 

Cosa posso fare per confrontare la struttura (i nodes) dell’HTML invece delle stringhe di HTML? Esiste una funzionalità di PHPUnit che consente questo? Esiste una libreria autonoma per confrontare HTML?

Soluzione:

PHPUnit ha asserzioni per confrontare XML:

  • assertXmlFileEqualsXmlFile()
  • assertXmlStringEqualsXmlFile()
  • assertXmlStringEqualsXmlString()

assertXmlStringEqualsXmlFile funziona perfettamente in questo scenario:

 public function testHtmlIsIdentical() { $this->report->setupSomeData('test data'); $this->assertXmlStringEqualsXmlFile('expected.html', $this->report->generateHtml()); } 

Bene, c’è DomDocument e se vuoi controllare che l’ordine degli elementi HTML corrisponda potresti usarlo.

Se tutto ciò che è diverso è uno spazio bianco ridondante, prova a:

 $expectedDom = new DomDocument(); $expectedDom->loadHTMLFile('expected.html'); $expectedDom->preserveWhiteSpace = false; $actualDom = new DomDocument(); $actualDom->loadHTML($this->report->generateHtml()); $actualDom->preserveWhiteSpace = false; $this->assertEquals($expectedDom->saveHTML(), $actualDom->saveHTML()); 

Vedi preservewhitespace .

Ciò che potrebbe valere la pena di esaminare è assertEqualXMLStructure quanto può essere utilizzato anche per confrontare l’HTML:

 assertEqualXMLStructure( DOMElement $expectedElement, DOMElement $actualElement [, bool $checkAttributes = false, string $message = ''] ) 

Ma potresti avere di nuovo problemi con gli spazi bianchi, quindi forse hai bisogno di spogliarli prima di compararli. Il vantaggio dell’utilizzo di DOM è che si ottiene una segnalazione degli errori molto più carina nel caso in cui i documenti non corrispondano.

Un altro modo per testare la generazione di XML / HTML è descritto in Pratica PHPUnit: Test di generazione XML .