testeando dependencias difíciles – Sin Mock

Hace unos días estuve «intentado» mejorar una librería para poder enviar comandos a Varnish y me encontré con unos cuantos problemillas para poder testar la librerías y así llegar a refactorizarla.

Varnish Cache

Según la wikipedia Varnish Cache es un acelerador de aplicaciones web, también conocido como caché de proxy HTTP inversa. Se instala delante de cualquier servidor HTTP y se configura para almacenar en el caché del servidor una copia del recurso solicitado. Esta ideado para aumentar el rendimiento de aplicaciones web con contenidos pesados y APIs altamente consumidas.

Básicamente lo que hace Varnish es ante una petición HTTP guardar la respuesta a esa petición y cada vez que un cliente realice la misma petición devolver el contenido guardado. Esto hace que nuestras aplicaciones multipliquen su velocidad por muchísimo, pero a la vez acarrea algunos problemas para invalidar la caché.

Motivación / el marrón

Un ejemplo básico sería un blog, si utilizamos Varnish para cachear los post ganaremos mucha en performance,pero que pasa si editamos un post ya publicado, para corregir una errata, para actualizarlo o lo que sea . Sería necesario descachear, pero no descachearlo todo, sino solo dicho post.

Una opción sencilla sería cada vez que editamos un post ejecutar el comando

Continúa leyendo «testeando dependencias difíciles – Sin Mock»

Anuncio publicitario

¿Cómo hacer una librería utilizable mediante composer?

Normalmente utilizo composer como gestor de dependencias en los proyectos PHP pero quería aprender como crear una librería/paquete (no se bien como traducirlo) que pudiese ser utilizada en otros proyectos de PHP.

En este post vamos a aprender como hacer SimplySlug una pequeña librería para crear slugs, es decir URL’s amigables y legibles por humanos.

Características de una buena librería Open Source en PHP

Para crear una buena librería lo mejor es basarnos en la checklist de phppackagechecklist.com en ella nos indican una serie de características básicas para garantizar un mínimo de calidad en nuestra librería:
Continúa leyendo «¿Cómo hacer una librería utilizable mediante composer?»

Mejorando con Mockery – Separando responsabilidades

Hace poco empezamos haciendo nuestra primera kata de código utilizando phpunit. En una primera iteración conseguimos una calculadora totalmente funcional. El código de la kata está en github (http://github.com/jeslopcru/php-coding-dojo).
Esta vez vamos a dar un pequeño empujón a la kata, emepzando a utilizar Mockery y sobre todo vamos a seguir aprendiendo buenas prácticas de desarrollo. Para hacer más intenresante la kata podemos activar phpcs o php-cs-fixer para que antes de hacer un commit analicemos el proyecto para hacer que nuestro código se adapte a un estandar. Yo como guía para instalarlo he utilizado esta referencia (http://sergigp.com/phpstorm-integrando-herramientas-de-calidad-de-codigo)

¿Donde lo dejamos?

Teníamos una calculadora funcional, que era capaz de sumar y restar, pero quizás ese switch es algo “feo”. Para quien no lo recuerde este esta es la función que estamos comentando:

    protected function calculate($num, $symbol)
    {
        if (!is_numeric($num)) {
            throw new InvalidArgumentException();
        }

        switch ($symbol) {
            case '+':
                $this->result += $num;
                break;

            case '-':
                $this->result -= $num;
                break;
        }
    }

Añadir más funciones a la calculadora haría aumentar el switch y eso creo que no es una buena solución.

Casi cada vez que utilizamos un switch podemos mejorarlo utilizando polimorfismo. Es cierto que esta regla de cambiar switch por polimorfismo no puede usarse siempre, pero sería bueno tenerla siempre en mente.

Continúa leyendo «Mejorando con Mockery – Separando responsabilidades»

El patron singleton en PHP y los test unitarios con PHPUnit

Llevamos una serie de post hablando sobre PHPUnit, sobre como hacer asserts y de patrones para hacer mejores test. Hoy vamos a comentar un poco acerca del patrón/antipatrón Singleton.

Según la Wikipedia El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.

Básicamente consiste en garantizar que una clase solo tenga una instancia y un punto de acceso.

Continúa leyendo «El patron singleton en PHP y los test unitarios con PHPUnit»

patrones test utilizando PHPUnit

Hace unos días vimos algunos patrones para mejorar los tests con PHPUnit, mejorando los assert y/o fixtures. En esta ocasión traemos una serie de patrones para mejorar nuestros tests en PHP.

Veremos una serie de técnicas sobre como afrontar los tests, haremos ejemplos, si bien es cierto que estos ejemplos serán en PHP, la teoría detrás de estos tests puede aplicarse a Java (JUnit), .NET, Python,…

Parametrized test

De vez en cuando, nos encontramos con que estamos escribiendo pruebas casi idénticas, que solo difieren en unos pocos valores, pero la lógica es esencialmente la misma. En estas situaciones es una buena práctica a la hora de hacer test utilizar el patron test parametrizados (parametrized test).

La idea fundamental es de este patrón reside en que solo hay un método de prueba que encapsula la lógica, con la ayuda de PHPUnit lo que hacemos es proporcionar a ese test distintos conjuntos de parámetros.

Continúa leyendo «patrones test utilizando PHPUnit»

Patrones para mejorar tests con PHP y PHPUnit – TDD

Ya hemos hablado bastantes veces sobre TDD, sobre como instalar PHPUnit, cómo utilizar PHPUnit y Silex para poder hacer Test Driven development, en definitiva ya hemos dado los primeros pasos. Ahora vamos a dar otro pequeño paso, aprenderemos algunos patrones para escribir mejores tests.

Hablaremos sobre buenas maneras de escribir assert, formas distintas de estructurar y construir fixtures y de algunos trucos a la hora de escribir pruebas para legacy code (código legado).

Vamos a aprender estos patrones mediante pequeños ejemplos utilizando PHPUnit, pero podría ser aplicable a cualquier otro lenguaje, ya que todo esto solo es un conjunto de buenas prácticas para hacer tests unitarios.

Patrones para realizar assert con PHPUnit

Los assert son la esencia de los tests, si no comprobamos mediante un assert o similar.
Vamos a ir viendo poco a poco distintos patrones de los más simples a algunos más complejos.

Continúa leyendo «Patrones para mejorar tests con PHP y PHPUnit – TDD»

Haciendo TDD en PHP con Silex y PhpUnit (Parte 2)

Hace unos días hemos empezado a trabajar con TDD y Silex en un proyectos bastante especial, “Como utilizar Tdd con Silex utilizando PhpUnit” para ello ya tenemos configurado todo el entorno par a poder empezar a hacer test, escribir código y refactorizar.

Básicamente nuestro proyecto es la API de una calculadora 😉 es decir es una calculadora con la que podremos realizar operaciones aritméticas de 2 operandos con tan solo hacer peticiones GET a una dirección web. Para ello los pasos que daremos serán, refactorizar la aplicación actual para poder ampliarla con la nueva funcionalidad, crear una librería que realice las operaciones aritméticas, modifica el routing para poder hacer las operaciones haciendo peticiones GET desde un Navegador.

Refactorizar el proyecto de Silex con TDD para ampliar la aplicación.

Ahora que tenemos test (aunque solo sean un par) podemos hacer cambios y asegurarnos de que todo sigue funcionando. Lo primero que haremos será mover toda la lógica de la App. Pero antes que nada debemos asegurarnos de que todo está correcto, así que antes de tocar nada lanzamos nuestros tests.

Continúa leyendo «Haciendo TDD en PHP con Silex y PhpUnit (Parte 2)»

PHPUnit y buenas prácticas

Hace ya unas semanas realicé unos post sobre como instalar PHPUnit para empezar con TDD. Hace unos días me llegó desde twitter un post sobre “Ser profesional” (http://plqd.blogspot.com.es/2013/07/ser-profesional.html) En el Pepe Doval cuenta experiencias tratando con personas más o menos profesional. Uno de los puntos clave que cuenta Doval es que el mundo de la programación es muy cambiante, llegan nuevos lenguajes y tecnologías cada día, por ello lo mejor la mejor manera de ser un profesional es aplicar buenas prácticas, desde comentar bien el código, hacer buenos commit, practicar TDD. Por eso llegado a este punto voy a escribir sobre buenas prácticas con PHPUnit.

He de decir que no soy un experto en la materia, esto son solo una serie de recomendaciones extraídas de Internet y que yo intento utilizar en la medida de lo posible, aunque para ser sincero no siempre consigo utilizarlas 😉

Vamos a basarnos en el ejemplo de la cuenta bancaria, es el mismo del post anterior sobre PHPUnit y el ejemplo clave de la documentación de PHPUnit (http://phpunit.de/manual/current/en/index.html)

Sé descriptivo acerca de lo que estás probando

Los test que escribimos deben ser autodescriptivos y con solo un vistazo al código debemos saber que se está probando. Esto puede ser fácil de decir pero bastante difícil de hacer, por ello en PHPUnit están las anotaciones como @Covers.

Continúa leyendo «PHPUnit y buenas prácticas»

Empezando con TDD – Primer ejemplo paso a paso

Ya lo tenemos todo instalado, xammp funcionando, eclipse pdt con el plugin de phpunit y hemos probado que todo funciona correctamente con un pequeño ejemplo. Ahora vamos con lo divertido.

Para recordarlo vamos a resumir en un momento esto del TDD

Test Driven Development (TDD)

TDD es una técnica para desarrollar y diseñar software. Consiste en escoger un requisito a desarrollar y aplicar estas reglas.

1 No escribir código ninguno, escribir primero una prueba (test)para el requisito.
2 Verificar que la prueba falla.
3 Escribir el código para pasar la prueba.
4 Ejecutar la prueba y comprobar que el código funciona.
5 Refactorizar el código para evitar duplicación.

Aserciones

Antes de entrar en materia, debemos conocer las aserciones, cada vez que escribimos n test debemos comprobar si se cumple una condición. Para ello PHPUnit nos provee de una serie de funciones llamadas asserts.

En la Wikipedia podemos ver que una aserción es un predicado (i.e., una sentencia verdadero-falso) incluido en un programa como indicación de que el programador piensa que dicho predicado siempre se cumple en ese punto del flujo de programa.

Aquí la tabla con las aserciones que se pueden utilizar en PHPUnit http://phpunit.de/manual/3.6/en/appendixes.assertions.html, pero no debemos preocuparnos no hay nada que “crtl + espacio” (autocompletado) no pueda solucionar 😉

Continúa leyendo «Empezando con TDD – Primer ejemplo paso a paso»