Twitter Flickr Pinterest LinkedIn YouTube Google Maps E-mail RSS
formats

Qué es una prueba unitaria, ventajas que posee y un ejemplo práctico en PHP.

Una prueba unitaria permite comprobar que una parte especifica de código de una determinada aplicación que está siendo programada o codificada no presenta fallos, errores, o cálculos inesperados.

Aunque el objetivo de la prueba de forma individual es encontrar fallos (bugs ), la meta final es aumentar la calidad del desarrollo, siendo uno de los objetivos principales de la IS ó Ingeniería del Software.

Las pruebas unitarias son vitales, pero a su vez poco empleadas, debido al mal uso del cálculo de tiempos en el desarrollo, la falta de conocimiento por parte de los directores de producto, así como los tabús y falsos aforismos típicos en informática, no pierdas tiempo en …, no merece la pena porque mi experiencia en …, etc.

Necesitaremos emplear un tiempo (15% aproximadamente) en nuestro desarrollo para llevarlas a cabo. Ese tiempo se escatima al programador.

Pero para realizar estas pruebas, es necesario tener claros unos conceptos, además de disponer de herramientas para llevarlas a cabo (aunque no siempre son necesarias).

– Las pruebas unitarias se tienen que poder ejecutar sin necesidad de intervención manual, mejorar la automatización de la ejecución.

– Las pruebas unitarias tienen que poder repetirse tantas veces como uno quiera, deben ser rápidas.

– Deben cubrir casi la totalidad del código de nuestra aplicación.

– Deben poder ser ejecutadas bajo cualquier entorno, es decir, que los casos de error sean reales entre plataformas.

– Deben ser independientes en su ejecución, no puede afectar la ejecución de otra.

– Deben ser tratadas como si fueran código (de la misma manera)

Por lo que se demuestra que para que una prueba unitaria sea correcta debiera ser (no siempre es obligatorio):

Automatizable, Completas, Repetibles o Reutilizables, Independientes, Profesionales.

Por lo tanto, respondiendo a la pregunta inicial  ¿ Qué ventajas me proporcionan ?

La capacidad de encontrar errores a tiempo, minimizar los comportamientos programáticos anómalos,  corregirles sin que se produzca efecto bola de nieve en nuestro desarrollo, aumentar la calidad en nuestros programas, maximizar la satisfacción del cliente (interno, externo).

Alientan el cambio: Facilitan que el programador cambie el código para mejorar su estructura (lo que se ha dado en llamar refactorización).

Minimizan  la integración: Puesto que permiten llegar a la fase de integración con un grado alto de seguridad de que el código está funcionando correctamente. De esta manera se facilitan las pruebas de integración. Que son otro tipo de pruebas con mayor grado de integración.

Documentan el código: Las propias pruebas son documentación del código puesto que ahí se puede ver cómo utilizarlo.

Separación de la interfaz y la implementación: Dado que la única interacción entre los casos de prueba y las unidades bajo prueba son las interfaces de estas últimas, se puede cambiar cualquiera de los dos sin afectar al otro, a veces usando objetos mock (mock object) para simular el comportamiento de objetos complejos. Ojo según los foros he visto discrepancia entre lo que es un mock y un stubs, y la delgada línea que los separa. Ambos son dos recursos que usamos en nuestras pruebas unitarias que nos permiten simular objetos con los que interactúa el módulo de que está sometido a la prueba. Los stubs se basan más en el estado y los mocks permiten comprobar en detalle las llamadas realizadas entre ellos.

Los errores  son más fáciles de localizar.

Unit test en PHP

Como he comentado, para poder realizar pruebas unitarias existen unas herramientas para facilitar su uso. Estas forman parte de frameworks de prueba. He seleccionado PHP por se un lenguaje de script del lado servidor muy empleado en la actualidad, no sin ello desmerecer a otros entornos, válidos y también ampliamente usados.

Voy a emplear SimpleTest
http://simpletest.org/

El probador SimpleTest PHP está disponible para su descarga desde SourceForge.

Es una clase para hacer pruebas unitarias con PHP y marco de pruebas Web.

Solo hay que descargarlo y colocar la carpeta simpletest dentro de tu proyecto o algún directorio global de PHP.

SimpleTest tiene muchas opciones más como el agrupar casos de prueba, escribir tus propias aserciones, mockups (simulaciones de escenarios) y pruebas web (aunque limitado). Efectivamente no es fácil de usar, aunque su nombre signifique eso.

Esta clase corresponde con 2 métodos para calcular el IVA:

class OperacionesConIVA
{
 
        function Calcular($precio, $tipo) {
		$iva=($precion*$tipo/100) + $precio;
return ($iva);
	}
 
	function DevolverIva($precio, $tipo) {
		$soloiva=($precio*$tipo/100);
return $soloiva;
	}
 
}

Se prueba de la siguiente forma:

require_once 'simpletest/autorun.php';
require_once 'OperacionesConIVA.php';
 
class TesteoClase extends UnitTestCase
{
	var $iva;
 
	function setUp() {
		$this->iva = new OperacionesConIVA ();
	}
 
	function testCalcular()
	{
		$result = $this->iva->Calcular(1200, 16);
		$this->assertEqual(1392, $result);
	}
 
	function testDevolverIVA()
	{
		$result = $this->area-> DevolverIva(1200, 16);
		$this->assertEqual(10, $result);
	}
 
}

SimpleTest corre todas las pruebas que note comienzan con el nombre test y nosotros tenemos 2 de ellas.

En caso de ser correcta aparecerá una pantalla del tipo:

 

En caso de producirse un error:

TestOfLogging
Fail: testLogCreatesNewFileOnFirstMessage->True assertion failed.
1/1 test cases complete. 1 passes and 1 fails.

Una respuesta

  1. Diego

    Muy buena explicación, muchas gracias. justo lo que andaba buscando 😀

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Home Ingeniería del Software Qué es una prueba unitaria, ventajas que posee y un ejemplo práctico en PHP.
© www.palentino.es, desde el 2012 - Un Blog para compartir conocimientos ...

Uso de cookies en mi sitio palentino.es

Este sitio web utiliza cookies para que tengamos la mejor experiencia de usuario. Si continúas navegando estás dando tu consentimiento para la aceptación de las mencionadas cookies y la aceptación de la política de cookies

ACEPTAR
Aviso de cookies