【问题标题】:How to unit test HTML output with PHPUnit?如何使用 PHPUnit 对 HTML 输出进行单元测试?
【发布时间】:2011-01-11 10:27:39
【问题描述】:

我是 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 的任何线索?

对不起,我的英语不好。

最好的问候,

【问题讨论】:

  • 我需要一些关于单元测试的指导。请问您如何开始对 Web 应用程序进行单元测试。进行单元测试后会得到什么输出。

标签: html unit-testing phpunit


【解决方案1】:

自 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。

【讨论】:

  • assertTag 在 4.2 版中已被弃用(当前稳定版为 4.6),原因是存在突出的错误和一般较差的实现 (github.com/sebastianbergmann/phpunit/issues/1292)。该错误对话框指向一个正在进行的 PHPUnit 扩展,它试图替换该功能。
【解决方案2】:

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

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

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

我们有一套作为 CI 流程的一部分运行的 Selenium 测试,让我们能够非常快速地查看我们的 HTML 输出是否有问题。

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

此外,它还与 PHPUnit(和其他特定于语言的工具)集成,因此它确实回答了您的问题,尽管可能不是您想的那样。

【讨论】:

  • 使用 Selenium 的问题是测试执行的性能。如果您不需要测试用户交互,那么比较 HTML 或类似技术会快得多。一开始你不会有这种感觉,但过了一段时间他们的缓慢开始拖累你。
【解决方案3】:

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

查看此帖子以获取an alternative approach。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      在哪里 $emailMarkup - 预期的 HTML 字符串 $html - 当前的 HTML 字符串

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

      &lt;br/&gt;

      改为

      &lt;br&gt;

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

      &lt;hr noshade="true"&gt;

      改为

      &lt;hr noshade&gt;

      【讨论】:

        【解决方案6】:

        最好不要针对模板进行验证(除非您想确保没有任何更改,但这是您可能想要的不同条件/测试)。您可能想要测试您的 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 都是有效的非常方便。我发现这个库的代码存在很多问题,绝对值得投入时间。希望大家也能从中受益。

        【讨论】:

          猜你喜欢
          • 2011-06-06
          • 1970-01-01
          • 2023-03-06
          • 2013-09-13
          • 1970-01-01
          • 2012-02-26
          • 2014-12-25
          • 2012-03-26
          • 2021-12-17
          相关资源
          最近更新 更多