daniel oeste
¿Hay alguna forma de probar el código de procedimiento? He estado mirando PHPUnit, que parece una excelente manera de crear pruebas automatizadas. Sin embargo, parece estar orientado hacia el código orientado a objetos, ¿existen alternativas para el código de procedimiento?
¿O debo convertir el sitio web a orientado a objetos antes de intentar probar el sitio web? Esto puede llevar un tiempo, lo cual es un pequeño problema ya que no tengo mucho tiempo que perder.
Puede probar el código de procedimiento con PHPUnit. Las pruebas unitarias no están ligadas a la programación orientada a objetos. Prueban unidades de código.. En OO, una unidad de código es un método. En PHP procedimental, supongo que es un script completo (archivo).
Si bien el código OO es más fácil de mantener y probar, eso no significa que PHP procesal no pueda probarse.
Por ejemplo, tienes este script:
simple_añadir.php
$arg1 = $_GET['arg1'];
$arg2 = $_GET['arg2'];
$return = (int)$arg1 + (int)$arg2;
echo $return;
Podrías probarlo así:
class testSimple_add extends PHPUnit_Framework_TestCase {
private function _execute(array $params = array()) {
$_GET = $params;
ob_start();
include 'simple_add.php';
return ob_get_clean();
}
public function testSomething() {
$args = array('arg1'=>30, 'arg2'=>12);
$this->assertEquals(42, $this->_execute($args)); // passes
$args = array('arg1'=>-30, 'arg2'=>40);
$this->assertEquals(10, $this->_execute($args)); // passes
$args = array('arg1'=>-30);
$this->assertEquals(10, $this->_execute($args)); // fails
}
}
Para este ejemplo, he declarado un _execute
método que acepta una matriz de parámetros GET, captura la salida y la devuelve, en lugar de incluir y capturar una y otra vez. Luego comparo la salida usando los métodos de aserciones regulares de PHPUnit.
Por supuesto, la tercera afirmación fallará (aunque depende de error_reporting), porque el script probado dará una índice indefinido error.
Por supuesto, al realizar la prueba, debe poner error_reporting en E_ALL | E_STRICT
.
-
¡Gracias por la respuesta detallada! Me ha ayudado mucho. De hecho, tengo funciones que se ocupan de toda la lógica comercial, así que supongo que puedo incluir el archivo PHP con estos y probarlos de manera similar.
– Daniel Oeste
16 de febrero de 2011 a las 20:25
-
@Daniel: Sí. En realidad, probar funciones es muy parecido a probar métodos de objetos. Le envía alguna entrada y valida si la salida coincide con lo que espera.
– codificador de red
16 de febrero de 2011 a las 20:27
-
Votado negativo por lo siguiente opinión declarado en esta respuesta: “El código OO es más fácil de mantener y probar”. Eso no es absolutamente cierto.
– vhs
18 de mayo de 2017 a las 5:28
-
Esta respuesta realmente no ayuda al código de procedimiento de prueba unitaria. Sugiera cómo podemos manejar las dependencias entre funciones. Una función puede estar llamando a varias otras funciones dentro de ella. Entonces, ¿cómo puedo probar esa función aisladamente de sus dependencias? Si el código estuviera orientado a objetos, podría usar objetos simulados/stub, etc. para simular el comportamiento de varias dependencias para generar varios casos de prueba posibles.
– rineez
9 de octubre de 2017 a las 7:48
-
¿Cómo se supone que debemos administrar script uris y ergo include declaraciones? Seguramente simplemente codificarlos en el método de prueba no es la forma correcta.
– Tscherg
11 mayo 2018 a las 10:42
PHPUnit utiliza interfaces estructuradas por objetos en sí mismo para la paridad con otras encarnaciones de xUnit y porque eso simplificó su propia implementación. Pero eso no significa que no se pueda usar para probar el código de procedimiento. (Sin embargo, podría no ser la única / mejor opción).
– mario
16 de febrero de 2011 a las 19:42
Sí, Mario, he visto otros como SimpleTest, sin embargo, PHPUnit parece ser el más utilizado y tengo algo de experiencia con JUnit, ¡así que la curva de aprendizaje debería ser mínima!
– Daniel Oeste
16 de febrero de 2011 a las 20:26