Puede probar la unidad de procedimiento de PHP, no hay problema. Y definitivamente no estás de suerte si tu código está mezclado con HTML.
En el nivel de prueba de aplicación o aceptación, su PHP procedimental probablemente depende del valor de los superglobales ($_POST, $_GET, $_COOKIE
, etc.) para determinar el comportamiento y termina incluyendo un archivo de plantilla y escupiendo el resultado.
Para realizar pruebas de nivel de aplicación, puede establecer los valores superglobales; inicia un buffer de salida (para evitar que un montón de html inunde tu pantalla); llamar a la página; afirmar contra cosas dentro del buffer; y trash la memoria intermedia al final. Así, se podría hacer algo como esto:
public function setUp()
{
if (isset($_POST['foo'])) {
unset($_POST['foo']);
}
}
public function testSomeKindOfAcceptanceTest()
{
$_POST['foo'] = 'bar';
ob_start();
include('fileToTest.php');
$output = ob_get_flush();
$this->assertContains($someExpectedString, $output);
}
Incluso para enormes "marcos" con mucha incluye, este tipo de pruebas le dirá si tiene características de nivel de aplicación funcionando o no. Esto va a ser muy importante a medida que empiece a mejorar su código, porque incluso si está convencido de que el conector de la base de datos aún funciona y se ve mejor que antes, querrá hacer clic en un botón y ver que, sí, todavía puede iniciar sesión y cerrar sesión en la base de datos.
En los niveles inferiores, existen pequeñas variaciones dependiendo del alcance de la variable y si las funciones funcionan por efectos secundarios (devolviendo verdadero o falso) o devuelven el resultado directamente.
¿Las variables se transmiten explícitamente, como parámetros o matrices de parámetros entre funciones? ¿O las variables se establecen en muchos lugares diferentes y se pasan implícitamente como globales? Si es el caso explícito (bueno), puede probar la función de una función (1) incluyendo el archivo que contiene la función, luego (2) alimentar los valores de prueba de función directamente, y (3) capturar la salida y afirmar contra ella. Si usa globales, solo tiene que tener mucho cuidado (como se indica arriba, en el ejemplo de $ _POST) para anular cuidadosamente todos los valores globales entre las pruebas. También es especialmente útil mantener las pruebas muy pequeñas (5-10 líneas, 1-2 afirmaciones) cuando se trata de una función que empuja y tira de muchos elementos globales.
Otro problema básico es si las funciones funcionan devolviendo la salida, o alterando los parámetros pasados, devolviendo verdadero/falso en su lugar. En el primer caso, la prueba es más fácil, pero una vez más, es posible en ambos casos:
// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertEquals($expectedOutput, $output);
}
en el caso grave, donde funciona su código por los efectos secundarios y devuelve verdadero o falso, todavía se puede probar con bastante facilidad :
/* suppose your cat function stupidly
* overwrites the first parameter
* with the result of concatenation,
* as an admittedly contrived example
*/
public function testShouldConcatenateTwoStringsAndReturnTrue()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertTrue($output);
$this->Equals($expectedOutput, $stringOne);
}
Espero que esto ayude.
Esto no es justo si el código que está probando está plagado de sentencias 'exit;' :( –
@YarekT Ninguna prueba puede tener un buen rendimiento si el código está lleno de sentencias 'exit' o' die'. La forma más comprobable de manejar la finalización esperada del script es lanzar una excepción y registrar un manejador de excepción personalizado que sea lo suficientemente inteligente como para ignorar el tipo de excepción personalizada cuando se encuentre. Luego puede probar que se produce la excepción esperada. Por supuesto, una aplicación bien diseñada realmente no debería Nunca he necesitado 'exit' o' die' después de la fase de arranque de todos modos. – rdlowrey