У меня есть сценарий командной строки, который генерирует некоторый HTML, который я пытаюсь выполнить с помощью PHPUnit. Обратите внимание, что этот HTML-код не просматривается браузером , поэтому Selenium не подходит для этого.
Меня интересует только сравнение фактической структуры HTML. Я использую assertEquals()
но фактические strings
могут быть не совсем идентичными из-за различных символов пробелов.
public function testHtmlIsIdentical() { $expectedReport = file_get_contents('expected.html'); $this->report->setupSomeData('test data'); $actualReport = $this->report->generateHtml(); $this->assertEquals($expectedReport, $actualReport); }
Что я могу сделать, чтобы сравнить структуру (узлы) HTML вместо строк HTML? Есть ли возможность PHPUnit, которая позволяет это? Есть ли отдельная библиотека для сравнения HTML?
PHPUnit имеет утверждения для сравнения XML:
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
assertXmlStringEqualsXmlFile
отлично работает в этом сценарии:
public function testHtmlIsIdentical() { $this->report->setupSomeData('test data'); $this->assertXmlStringEqualsXmlFile('expected.html', $this->report->generateHtml()); }
Ну есть DomDocument, и если вы хотите проверить, соответствует ли порядок элементов html, вы можете это использовать.
Если все, что отличается, является избыточным пробелом, попробуйте:
$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());
-$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());
Смотрите: preservewhitespace
То, что может быть интересно, – assertEqualXMLStructure :
assertEqualXMLStructure( DOMElement $expectedElement, DOMElement $actualElement [, boolean $checkAttributes = FALSE, string $message = ''] )
так как это можно использовать для сравнения html.
Но вы можете столкнуться с проблемами с пробелами снова, поэтому, возможно, вам нужно снять их перед сравнением. Преимущество использования DOM заключается в том, что вы получаете гораздо более приятную отчетность об ошибках, если документы не совпадают.
Другой способ тестирования генерации xml / html описан в:
Practical PHPUnit: Testing XML generation