Pruebas unitarias para HTML Output?

Esta puede ser una pregunta tonta, pero ¿realiza pruebas unitarias para la salida HTML de sus funciones / scripts PHP?

Intento mantener mi HTML y mi PHP separados, es decir, HTML incluye marcadores de posición y funciones para ciertos elementos recurrentes (datos tabulares / cualquier tipo de salida en bucle), pero no estoy seguro de cómo verificar esto.

¿Existe una manera estándar de hacer estas cosas, o se trata principalmente de usar pruebas de unidades regulares sobre las funciones que crean el contenido insertado y luego asegurarse de que se vean correctas en el navegador / Validador W3C?

Gracias.

Editar: Supongo que un corolario de esto sería: ¿vale la pena tener este tipo de pruebas unitarias? Si mantiene su contenido y estructura adecuadamente separados, entonces realmente solo estaría probando un puñado de inclusiones en escenarios muy limitados (presumiblemente, de todos modos). ¿Realmente vale la pena hacerlo en páginas completas de manualidades para solo tener un archivo para comparar?

    En base a mi experiencia en probar HTML, ahora sigo estas tres reglas básicas:

    1. No pruebe la salida HTML contra una plantilla correcta. Modificará el HTML emitido con demasiada frecuencia, y terminará perdiendo el tiempo manteniendo sus pruebas.

    2. Verifique la existencia de datos importantes en HTML generado. Si está generando HTML (a diferencia del HTML estático que escribió una vez), pruebe el HTML generado para obtener datos importantes. Por ejemplo: si está generando una tabla basada en una matriz bidimensional, verifique que los valores en la matriz se encuentren en algún lugar del HTML generado. No se moleste en validar el resultado completo, ya que esto violaría el # 1.

    3. Validar si el resultado es HTML correcto. Valide todos los resultados para HTML correcto a fin de evitar errores estúpidos, como falta de tags finales. He escrito una biblioteca para esto, que se puede usar de manera totalmente gratuita.

    Esta biblioteca PHP le permitirá validar si una cadena es válida HTML5. La biblioteca usa Validator.nu. Compatible con PHPUnit o cualquier otro marco de prueba.

    Descargar y documentación aquí.

    Fácil de usar, ejemplo:

    $validator=new HTML5Validate(); // Validate (returns TRUE or FALSE) $result=$validator->Assert('

    Hello World

    '); // Get explanation of what's wrong (if validation failed) print $validator->message;

    Las pruebas de salida HTML se considerarán una prueba de cobertura. Inicialmente, cuando comencé a usar PHP, estaba creando estas pruebas, pero con el tiempo descubrí que estas pruebas no eran realmente tan útiles.

    Si hay algo que sé, es que la presentación va a cambiar mucho desde el desarrollo inicial hasta la implementación.

    Si lo piensas, un ciclo for realmente no es lógico sino que es una función de transformación isométrica, y si sigues la Separation of Concerns , entonces estás pasando los datos al bucle for mediante un método de algún tipo. Recomendaría probar que el bucle for obtiene los datos correctos, pero no la salida del bucle for.

    Si te encuentras repitiendo tu mismo en la generación de tablas, entonces comienza la prueba unitaria de esas plantillas de tablas. Pero una vez más, encontrarás que esas plantillas verán muchos cambios.

    En este punto, debería considerar separar la iteración de la salida HTML para ayudarlo a aislarse de estas preocupaciones en sus pruebas.

    Una forma de hacerlo es usar una función de mapeo, tomará una función de lista y transformación y realizará la función en cada elemento de la lista, luego regresará la lista transformada.

    Normalmente, al crear tablas, termino con dos bucles para crear una fila.

    1. Iterato sobre todas las filas.
    2. Mientras que en (1) repite los elementos en fila.

    Bastante feo a la prueba de la unidad, pero con cierres puede crear generadores de funciones que sería realmente fácil [esto se dice con un grano de sal] para implementar.

    Puedes usar PHPUnit. Tiene pruebas de salida.

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

    Considero que el framework SimpleTest es muy útil, generalmente lo uso para pruebas de integración y PhpUnit para pruebas unitarias. Me ahorran una gran cantidad de formuladores enviados manualmente, lo que haría de lo contrario una y otra vez.

    Me volví un hábito seguir estos puntos al hacer tales pruebas de integraciones:

    1. Intenta no repetir las pruebas que ya están hechas con pruebas unitarias reales. Si, por ejemplo, tiene una función de validación probada por unidad para las direcciones de correo electrónico, no tiene sentido enviar todo tipo de direcciones de correo electrónico no válidas. Solo verifique una vez si se le redirige con un mensaje de error.
    2. No compare el HTML resultante con un resultado de referencia completo, tendría que actualizar sus pruebas con cada rediseño de sus páginas. En su lugar, solo verifique las partes cruciales con $webTestCase->assertText('...'); o $webTestCase->assertPattern('/.../'); .

    Con algunas pequeñas funciones de ayuda, puede ganar mucha solidez. La siguiente función abrirá una página y verificará si la página se abrió correctamente sin advertencias. Dado que no existe un comstackdor de PHP que pueda emitir advertencias en el momento del diseño, al menos puede asegurarse de que su código no produzca errores ni advertencias.

     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)); } } 

    Estas pruebas le darán poco trabajo, puede comenzar con pruebas muy leves, pero le dan una respuesta instantánea si algo falla, con solo un clic del mouse.

    Hay una extensión para PHPUnit que hace la validación html aquí: https://github.com/xvoland/html-validate

    Enfrentando esta pregunta yo mismo. Creo que un enfoque podría ser usar algo como phpQuery para hacer que tus pruebas sean menos frágiles. En lugar de probar la salida exacta, pruebe que debería haber una etiqueta h3 ~ en algún lugar ~ en la salida. Si se ve envuelto en un div más tarde porque un diseñador necesitó virar sobre un fondo adicional, o debido a alguna solución de error flotante ie6, entonces su prueba todavía funciona.

    No es muy puro, pero es una herramienta potencialmente muy útil.

    En algunos casos (como CakePHP Helpers ), el propósito de una clase o función es generar HTML consistente para usted. En tales casos, es importante probar que las propiedades esperadas de la unidad generada de HTML son correctas para entradas dadas. La pregunta es definitivamente válida en ese contexto.

    PHPUnit proporciona una función assertTag () para este propósito.

    Sin embargo, para hacer eco de los demás; Es importante destacar que las pruebas unitarias deben realizarse sobre los componentes más pequeños posibles de su proyecto, y no sobre las páginas web renderizadas completas. Existen otras herramientas ( Selenio, por ejemplo) diseñadas para garantizar que esos componentes individuales se integren correctamente.

    Una forma muy simple de hacer esto es con el buffer de salida.

    p.ej

     ob_start(); function_which_produces_some_output(); $this->assertEquals( ob_get_clean(), '

    Expected Output Here

    ');