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

Seguir leyendo “testeando dependencias difíciles – Sin Mock”

¿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:
Seguir 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.

Seguir 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.

Seguir 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.

Seguir 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.

Seguir 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.

Seguir leyendo “Haciendo TDD en PHP con Silex y PhpUnit (Parte 2)”