Anti-patrones de tests, no cometas los mismos errores que yo

Te llega un email, es otro ticket de ese envío de notificaciones que hiciste hace tiempo, la solución que hiciste tiene otro bug,.. ¿te suena? O abrir un pedazo de código, empezar a leerlo y que te entren sudores fríos porque no entiendes nada o porque lo que vemos allí no quieres tocarlo ni con un palo… y lo peor es que haces un git blame y eres tu mismo el que escribiste eso en un «día de inspiración». Quizás esos pedazos de código puedan ser un buen ejemplo de anti-patrón. Un anti-patrón es una serie de técnicas que nos conducen a una mala solución para un problema. Lo mejor que puedes hacer con los anti-patrones es conocerlos para así puedas evitarlos en el futuro.

Hoy me gustaría escribirte una pequeña recopilación de anti-patrones de tests. Hace unos años ya escribí sobre «patrones test utilizando PHPUnit» y sobre «patrones de test, mejorando la arquitectura en PHP» así que vamos allá.

Continúa leyendo «Anti-patrones de tests, no cometas los mismos errores que yo»
Anuncio publicitario

Buenas prácticas de desarrollo en Etsy Parte 3

Esta es la tercera parte de la traducción del manual de buenas prácticas de Testing en Etsy donde se aborda el tema del Legacy Code.

Legacy code

La mayoría del código fuente que ha sobrevivido normalmente no fué escrito con un diseño limpio o pensando en la usabilidad/reutilización. Puede tener estado global, o no tener ninguna abstracción ( de modo que, por ejemplo, todas las operaciones de base están en una clase o en un método aislado que no está relacionado con la base de datos).

Vamos a tener que utilizar la imaginación cuando nos encontramos con código como este. Al final, nuestro trabajo está por hacer, tenemos que diseñar el código de acuerdo a unas normas, independientemente de como interactue ahora.

Continúa leyendo «Buenas prácticas de desarrollo en Etsy Parte 3»

Buenas prácticas de desarrollo en Etsy Parte 2

Esta es la segunda parte de la traducción del manual de buenas prácticas de Testing en Etsy

Testeando las partes juntas

El código ha sido escrito para el cliente y el servidor, pero solo ha sido testeado de manera separada. Nosotros queremos testar que el sistema actual funciona, por ejemplo que nosotros podemos enviar un trabajo real desde un JobClient a un JobServer real.

Una aproximación común es empezar a testear cada interacción entre cualquiera de las 2 partes del sistema (a veces son llamados ‘test de integración’).

¿Qué estamos testeando exactamente?

Preguntate a ti mismo que ocurre entre un cliente y un servidor que no pueden ser testeados el uno o el otro individualmente. Esto son las cosas de las que no debemos preocuparnos a este nivel, porque setear componentes de la vida real para testearlos al mismo tiempo es más difícil que testearlos uno por uno por separado. Así que contaremos con ese esfuerzo.

Continúa leyendo «Buenas prácticas de desarrollo en Etsy Parte 2»

Buenas prácticas de testing en Etsy Parte 1

Este artículo es un un conjunto de buenas prácticas para testing utilizadas en Etsy. Es la primera parte de una traducción de este documento sobre buenas prácticas de testing.

¿Qué es este documento?

Esto es una introducción a las ideas y aproximaciones que motivan el buen testing. Tomaremos un ejemplo de un sistema escrito en PHP y testeado con PHPUnit y discutiremos como testear un buen diseño y como diseñar teniendo en mente la testesabilidad.

etsy logo

Audiencia y prerrequesitos

Este documento está pensado para cualquier ingeniero de Etsy.

Continúa leyendo «Buenas prácticas de testing en Etsy Parte 1»

Ejecutando test en paralelo con PHPUnit

Ya hemos visto como crear test con PHPUnit, también hemos visto técnicas sobre como mejorar nuestros tests. Llegados a este punto tenemos claro que es necesario hacer test unitarios, pero ¿que pasa cuando queremos ejecutar muchos tests unitarios? PHPUnit ejecuta test secuencialmente, pero esto a veces puede ser una tarea lenta.

Existen muchas formas de lanzar test de PHPUnit en paralelo y en este post veremos algunas herramientas para que los tests unitarios que tenemos puedan ejecutarse a la vez.

Creando el proyecto

Para poder probar las distintas soluciones vamos a crear un pequeño proyecto de ejemplo con una serie de test y algunos retardos para poder medir cuánto se gana ejecutando en paralelo varios tests unitarios.

Continúa leyendo «Ejecutando test en paralelo con PHPUnit»

patrones de test, mejorando la arquitectura en PHP

Seguimos la serie de post sobre patrones de testing utilizando PHPUnit. Ya hemos visto muchos patrones y también muchas formas de afrontar los testa cuando tenemos que testear código legacy. Aunque si bien es cierto, la mejor manera de testear este código legacy es apoyarse en el refactor automático de los IDE y en la cautela.

Esta vez vamos ha tratar unos patrones más para poder testear aplicaciones. Así que adelante.

Layer test

Muchas aplicaciones web de hoy en día utilizan una arquitectura en capas, por ejemplo una capa de infraestructura (persistencia de datos), una capa de servicio y una capa de presentación (para manejar el HTML).

Continúa leyendo «patrones de test, mejorando la arquitectura en PHP»

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»

Primeros pasos con las pruebas de carga en Liferay utilizando JMeter

Cuando estamos desarrollando,  necesitamos conocer como se comportará nuestra solución si recibe un gran tráfico. Por ello, como ya tenemos un poco de experiencia con Liferay portal es una solución robusta, vamos a realizar unos primeros pasos sobre como configurar JMeter para hacer Test de stress.

JMeter es una herramienta para poder realizar pruebas de carga, aunque en realidad podemos realizar muchas otras pruebas como por ejemplo pruebas unitarias para conexiones de bases de datos con JDBC, FTP, LDAP, Servicios web, JMS, HTTP…

Instalando JMeter

Lo primero que tenemos que hacer es descargar JMeter de su página oficial (http://jmeter.apache.org/download_jmeter.cgi) y descomprimirlo.

Una vez hecho esto vamos a la carpeta y allí /bin y ejecutamos ApacheJMeter.jar

Continúa leyendo «Primeros pasos con las pruebas de carga en Liferay utilizando JMeter»