我是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的任何线索?
抱歉我的英语不好。
最诚挚的问候,
答案 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都是有效的。我发现此库的代码有很多问题,绝对值得花时间。希望每个人也能从中受益。