无论空格如何,PHPUnit都断言相同的HTML结构

时间:2011-08-23 21:29:16

标签: php html unit-testing phpunit

我有一个命令行脚本,它生成一些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的断言:

assertXmlStringEqualsXmlFile在这种情况下非常有效:

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

2 个答案:

答案 0 :(得分:11)

那么有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());

请参阅preservewhitespace

还值得研究的是assertEqualXMLStructure,因为这也可用于比较HTML:

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

但是你可能会再次遇到空白问题,所以也许你需要在比较之前删除它们。使用DOM的好处是,如果文档不匹配,您可以获得更好的错误报告。

另一种测试XML / HTML生成的方法在Practical PHPUnit: Testing XML generation中进行了描述。

答案 1 :(得分:0)

如果您只关心有效的HTML,但不匹配确切的模板,则建议使用https://packagist.org/packages/phpfui/html-unit-tester

您基本上希望通过验证程序运行尽可能多的生成的html和css。您真正关心的是HTML(和CSS)的格式正确。这适应了将来的功能和与数据相关的更改。您的代码必须产生有效的HTML和CSS。

https://packagist.org/packages/phpfui/html-unit-tester根据w3.org标准进行验证,因此将始终与最新的HTML规范保持一致。

并不是您要查找的内容,而是您应该执行的非常有效的测试。