Модульные тесты для вывода HTML? - PullRequest
14 голосов
/ 07 августа 2010

Это может быть глупый вопрос, но вы проводите модульные тесты для вывода HTML ваших функций / скриптов PHP?

Я пытаюсь разделить мой HTML и мой PHP - т.е. HTML включает в себя заполнители,и функционирует для определенных повторяющихся элементов (табличных данных / любого вида зацикленного вывода) - но я не уверен, как это проверить.

Есть ли стандартный способ решения таких задач или нет?В основном речь идет об использовании регулярных модульных тестов для функций, которые создают вставленного содержимого, а затем проверки его корректности в браузере / W3C Validator?

Спасибо.

Редактировать: Я думаю, что следствием этого будет: эти виды модульных тестов даже стоит иметь?Если вы держите свой контент и структуру должным образом разделенными, то вы действительно будете тестировать лишь несколько включений в очень ограниченных сценариях (предположительно, в любом случае).Неужели стоит наполовину изготовить полные страницы, чтобы получить файл для сравнения?

Ответы [ 8 ]

9 голосов
/ 01 апреля 2015

Основываясь на моем опыте тестирования HTML, я теперь следую этим трем основным правилам:

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

2.Проверьте наличие важных данных в сгенерированном HTML. Если вы генерируете HTML (в отличие от статического HTML, который вы написали один раз), проверьте сгенерированный HTML на наличие важных данных.Например: если вы генерируете таблицу на основе двумерного массива, убедитесь, что значения в массиве находятся где-то в сгенерированном HTML.Не пытайтесь проверить полный вывод, так как это нарушит # 1.

3.Проверьте, если вывод соответствует HTML. Проверьте весь вывод на правильный HTML, чтобы избежать глупых ошибок, таких как отсутствующие конечные теги.Я написал для этого библиотеку, которую можно использовать абсолютно бесплатно.

Эта библиотека PHP позволит вам проверить, является ли строка верным HTML5.Библиотека использует Validator.nu.Совместим с PHPUnit или любым другим фреймворком для тестирования.

Скачать и документацию здесь.

Простой в использовании, пример:

$validator=new HTML5Validate();

// Validate (returns TRUE or FALSE)
$result=$validator->Assert('<p>Hello World</p>'); 

// Get explanation of what's wrong (if validation failed)
print $validator->message; 
5 голосов
/ 08 августа 2010

Проверка вывода HTML будет считаться проверкой покрытия.Первоначально, когда я начал использовать PHP, я создавал эти тесты, но со временем обнаружил, что эти тесты на самом деле не так уж и полезны.

Если есть одна вещь, которую я знаю, это то, что презентация изменит лот с первоначальной разработки на развертывание.

Если подумать,Цикл for на самом деле не логика, а функция изометрического преобразования, и если вы следуете Separation of Concerns, то вы передаете данные в цикл for с помощью какого-то метода.Я бы рекомендовал проверить, что цикл for получает правильные данные, но не выводит цикл for.

Если вы обнаружите, что повторяете себя при создании таблиц, то непременно начните модульное тестирование этих шаблонов таблиц.Но еще раз, вы обнаружите, что эти шаблоны будут подвергаться значительным изменениям.

На этом этапе вам следует подумать о том, чтобы отделить итерацию от вывода HTML, чтобы помочь вам изолировать себя от этих проблем в ваших тестах..

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

Обычно при создании таблиц я получаю два цикла for для создания строки.

  1. Итерация по всем строкам.
  2. В то время как в (1) выполняется итерация по элементам в строке.

Довольно уродливо для модульного тестирования, но с помощью замыканий вы можете создавать генераторы функций, которые действительно было бы легко [это сказано с долей соли] реализовать.

3 голосов
/ 07 августа 2010

Вы можете использовать PHPUnit.Тестирование на выходе.

http://www.phpunit.de/manual/3.0/en/testcase-extensions.html

1 голос
/ 28 сентября 2012

Мне показалось, что фреймворк SimpleTest очень полезен, обычно я использую его для интеграционных тестов и PhpUnit для юнит-тестов. Они избавляют меня от множества форм, поданных вручную, которые я бы делал снова и снова.

При выполнении таких интеграционных тестов стало привычкой следовать этим пунктам:

  1. Старайтесь не повторять тесты, которые уже сделаны с реальными юнит-тестами. Если, например, у вас есть проверенная модулем функция проверки адресов электронной почты, нет смысла отправлять все виды недействительных адресов электронной почты. Проверьте только один раз, если вы перенаправлены с сообщением об ошибке.
  2. Не сравнивайте полученный HTML-код с полным справочным выходом, вам придется обновлять свои тесты с каждым редизайном ваших страниц. Вместо этого проверяйте только важные детали с помощью $webTestCase->assertText('...'); или $webTestCase->assertPattern('/.../');.

С некоторыми крошечными вспомогательными функциями вы можете получить большую надежность. Следующая функция откроет страницу и проверит, была ли страница открыта успешно без предупреждений. Поскольку не существует компилятора для PHP, который мог бы выдавать предупреждения во время разработки, вы можете по крайней мере убедиться, что ваш код не будет выдавать ошибки или предупреждения.

public static function openPageWithNoWarnings($webTestCase, $page, $landingPage = null)
{
  // check that page can be opened successfully
  $webTestCase->assertTrue($webTestCase->get($page));

  // check that there are no PHP warnings
  $webTestCase->assertNoPattern('/(warning:|error:)/i', 'PHP error or warning on page!');

  // check if landed on expected page (maybe a redirect)
  if (!empty($landingPage))
  {
    $url = $webTestCase->getUrl();
    $file = basename(parse_url($url, PHP_URL_PATH));
    $webTestCase->assertEqual($page, $file,
      sprintf('Expected page "%s", got page "%s".',  page, $file));
  }
}

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

1 голос
/ 28 сентября 2012

Здесь есть расширение для PHPUnit, которое выполняет проверку html: https://github.com/xvoland/html-validate

0 голосов
/ 21 июня 2014

Один очень простой способ сделать это с буферизацией вывода.

например

ob_start();
function_which_produces_some_output();
$this->assertEquals( ob_get_clean(), '<p>Expected Output Here</p>');
0 голосов
/ 31 января 2014

В некоторых случаях (например, CakePHP Helpers ) цель класса или функции - создать для вас согласованный HTML. В таких случаях важно проверить, что ожидаемые свойства сгенерированного блока HTML верны для заданных входных данных. Вопрос определенно актуален в этом контексте.

PHPUnit предоставляет для этой цели функцию assertTag () .

Однако, чтобы повторить других; Важно подчеркнуть, что тестирование unit должно проводиться на минимально возможных компонентах вашего проекта, а не на целых отображаемых веб-страницах. Существуют и другие инструменты (например, Selenium ), предназначенные для обеспечения того, чтобы эти отдельные компоненты были интегрированы вместе.

0 голосов
/ 23 декабря 2010

Сам столкнулся с этим вопросом.Я думаю, что подход может заключаться в использовании чего-то вроде phpQuery, чтобы сделать ваши тесты менее хрупкими.Вместо того, чтобы проверять точный вывод, проверьте, что где-то в выводе должен быть тег h3.Если он будет заключен в div позже, потому что дизайнеру нужно было добавить дополнительный фон, или из-за некоторого обходного пути с ошибкой ie6, тогда ваш тест все еще работает.полезный инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...