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

10

我是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应用程序开始进行单元测试吗?在进行单元测试后,将获得什么输出结果? - Kumar Shanmugam
6个回答

9
自2013年起,PHPUnit提供了另一种测试HTML输出的方法。这种方法是使用assertTag()方法,在PHPUnit 3.7和3.8版本中都可以找到。
例如:
// 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官方网站了解更多信息。

5
"assertTag"在4.2版本中已被弃用(当前稳定版本为4.6),原因是由于存在严重错误和实现不佳(https://github.com/sebastianbergmann/phpunit/issues/1292)。该错误对话框指向一个正在进行的PHPUnit扩展,试图替换该功能。" - Seth Battin

3
您可能需要考虑使用Selenium。它是一种基于浏览器的测试工具,用于对网站进行功能测试。
您可以编写脚本来加载Web浏览器并模拟点击和其他操作,然后进行断言以检查特定页面元素是否存在,是否在正确位置或包含预期值等。
这些测试可以使用作为Firefox插件运行的IDE编写,但是它们可以针对所有主要浏览器运行。
我们有一套Selenium测试,作为我们CI过程的一部分运行,允许我们非常快速地发现我们的HTML输出是否出现了问题。
总的来说,它是一个非常强大的测试工具。
此外,它与PHPUnit(和其他语言特定的工具)集成,因此它确实回答了您的问题,尽管可能不是您想到的方式。

2
使用Selenium的问题在于测试执行的性能。如果您不需要测试用户交互,则使用HTML比较或类似技术要快得多。开始时,您可能感觉不到它,但是一段时间后,它们的缓慢性会开始拖累您。 - ivanjovanovic

3

在比较输出的HTML与正确的模板时,您应该稍微小心。您的HTML将会有很大变化,您可能会花费太多时间来维护测试。

请参阅此帖子,了解另一种方法


2
您可以使用PHPUnit的assertXmlStringEqualsXmlString方法比较两个HTML字符串:
$this->assertXmlStringEqualsXmlString($emailMarkup, $html);

需要翻译的内容:

$emailMarkup - 预期的 HTML 字符串

$html - 当前的 HTML 字符串

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

<br/>

代替

<br>

此外,标签属性必须具有值,例如请使用

<hr noshade="true">

代替

<hr noshade>


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

1
最好不要根据模板进行验证(除非你想确保没有任何更改,但这是一个不同的条件/测试,你可能想要)。您可能希望测试您的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都是有效的非常方便。使用这个库,我发现了很多问题,这个工具值得投入时间。希望每个人都能从中受益。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接