如何使用PHPUnit对HTML输出进行单元测试?

时间:2011-01-11 10:27:39

标签: html unit-testing phpunit

我是PHPUnit的新手,我在单元测试HTML输出方面遇到了一些麻烦。

我的测试如下:

/**
* @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);

}

我的问题是DOMDocument对象生成一些HTML代码,我无法比较它。如何打印DOMDocument对象以查看输出?关于如何比较HTML的任何线索?

抱歉我的英语不好。

最诚挚的问候,

7 个答案:

答案 0 :(得分:5)

自2013年以来,还有另一种使用PHPUnit测试HTML输出的方法。 它使用了可以在PHPUnit 3.7和3.8中找到的assertTag()方法。

例如:

// 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);

阅读更多官方PHPUnit Website

答案 1 :(得分:2)

您可能需要考虑查看Selenium。它是一个基于浏览器的测试工具,用于为网站进行功能测试。

您编写的脚本涉及加载Web浏览器并模拟点击和其他操作,然后执行断言以检查特定页面元素是否存在,位于正确的位置或包含预期值。

测试可以使用作为Firefox插件运行的IDE编写,但可以针对所有主流浏览器运行。

我们有一套Selenium测试作为CI过程的一部分运行,让我们可以非常快速地看到HTML输出是否出错。

总而言之,它是一个非常强大的测试工具。

此外,它与PHPUnit(以及其他特定于语言的工具)集成,因此它可以回答您的问题,尽管可能与您的想法不同。

答案 2 :(得分:2)

在将输出的HTML与正确的模板进行比较时,您应该小心谨慎。您的HTML会发生很大变化,最终可能会花费太多时间来维护测试。

请参阅an alternative approach的这篇文章。

答案 3 :(得分:1)

您可以使用DOMDocument的saveHtml方法并比较输出。

答案 4 :(得分:1)

您可以使用PHPUnit assertXmlStringEqualsXmlString方法比较两个HTML字符串:

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

,其中 $emailMarkup - 预期的HTML字符串 $html - 当前的HTML字符串

重要! HTML字符串必须是XML有效的。例如,使用

  

<br/>

而不是

  

<br>

标签属性也必须包含值,例如使用

  

<hr noshade="true">

而不是

  

<hr noshade>

答案 5 :(得分:0)

最好不要针对模板进行验证(除非您想确保没有任何变化,但这是您可能想要的不同条件/测试)。

最好确保HTML(和CSS)的格式正确,无论格式如何。这样可以适应将来的功能和与数据相关的更改。

签出https://packagist.org/packages/phpfui/html-unit-tester,这是现代的HTML和CSS单元测试器。它根据w3.org标准进行验证,因此将始终保持最新状态。

答案 6 :(得分:0)

最好不要针对模板进行验证(除非您想确保没有任何变化,但这是您可能想要的不同条件/测试)。您可能想要测试您的HTML是否包含用户实际应看到的内容,而不是格式化输出的实际HTML正是模板中的内容。我建议您通过将HTML转换为纯文本的转换器发送HTML,然后进行测试以查看是否获得正确的结果。这适应了软件开发中不可避免的未来功能和与数据相关的更改。您不希望测试失败,因为有人在某处添加了一个类。这可能是一个自定义类型测试,您可能需要自己编写代码以满足您的需求。

最好也要确保HTML(和CSS)的格式正确,无论格式如何。有时浏览器会合理地解析和显示无效的HTML,但最好不要依赖浏览器知道如何处理无效的HTML和CSS。我已经看到许多仅通过更正HTML即可解决的问题。

我开发了一个输出HTML PHPFUI的库,但是找不到PHPUnit的任何最新的甚至是受支持的HTML单元测试。因此,我创建了https://packagist.org/packages/phpfui/html-unit-tester,它是现代的HTML和CSS单元测试器。它根据w3.org标准进行验证,因此将始终保持最新状态。

基本上,您可以传入HTML片段或整个页面,这将检查HTML的有效性。您可以测试字符串,文件甚至实时URL。确保您生成的所有HTML和CSS都是有效的。我发现此库的代码有很多问题,绝对值得花时间。希望每个人也能从中受益。