2011-01-11 2 views
3

Я новичок в PHPUnit, и у меня есть проблема с тестированием HTML-вывода.Как модульное тестирование вывода HTML с помощью PHPUnit?

Мой тест заключается в следующем:

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

мне нужно некоторое руководство от вас об испытании на единицу. пожалуйста, как начать модульный тест для веб-приложения. Какой результат будет получен после выполнения модульного теста. –

ответ

1

Вы можете использовать saveHtml метод DOMDocument и сравните результат.

+0

Спасибо за ответ. Это решило мою проблему. С наилучшими пожеланиями, –

1

Возможно, вы захотите рассмотреть вопрос о Selenium. Это браузерный инструмент для тестирования функциональных тестов для веб-сайта.

Вы пишете сценарии, связанные с загрузкой веб-браузера и имитацией кликов и других действий, а затем выполняете проверки, чтобы проверить, что, например, присутствуют конкретные элементы страницы, в нужном месте или содержат ожидаемые значения.

Тесты могут быть записаны с использованием среды IDE, которая работает как плагин для Firefox, но их можно запустить против всех основных браузеров.

У нас есть набор тестов Selenium, которые выполняются как часть нашего процесса CI, что позволяет нам видеть очень быстро, если что-то пошло не так с нашим выходом HTML.

В целом, это очень мощный инструмент для тестирования.

Кроме того, он интегрируется с PHPUnit (и другими языковыми инструментами), поэтому он отвечает на ваш вопрос, хотя, вероятно, не так, как вы думали.

+1

Проблема с использованием Selenium - это выполнение теста. Если вам не нужно проверять взаимодействие с пользователем, то гораздо быстрее выполняется сравнение HTML или аналогичных методов. В начале вы этого не чувствуете, но через некоторое время их медленность начинает тащить вас вниз. – ivanjovanovic

4

По состоянию на конец 2013 года существует еще один способ протестировать выход HTML с использованием PHPUnit. Он использует метод 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 Website.

+1

'assertTag' устарел в версии 4.2 (текущая стабильная версия - 4.6) из-за выдающихся ошибок и плохой реализации (https://github.com/sebastianbergmann/phpunit/issues/1292). Этот диалог ошибок указывает на продолжающееся расширение PHPUnit, которое пытается заменить функциональность. –

2

Вы должны быть немного осторожны при сравнении выводимого HTML с правильным шаблоном. Ваш HTML сильно изменится, и вы можете потратить слишком много времени на поддержание своих тестов.

Посмотрите это сообщение для an alternative approach.

0

Вы можете сравнить два HTML строки с помощью метода PHPUnit assertXmlStringEqualsXmlString:

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

где $emailMarkup - ожидаемый HTML строка $html - текущий HTML строка

Важно! Строки HTML должны быть XML-действительными.Например использовать

<br/>

вместо

<br>

Тег атрибуты должны иметь значения, например, использовать

<hr noshade="true">

вместо

<hr noshade>

Смежные вопросы