Mi top five de herramientas de programación

Es bien sabido que un buen profesional se apoya en diversas herramientas para cumplir con su trabajo. En este post te quiero enseñar cual es mi top five de herramientas de programación. Y no, no me valen los listos que puedan decir que el ordenador o la cafetera. Eso es una completa obviedad así que dejemos los chistes a parte y comencemos 😉

Las herramientas de programación que mas utilizo

Algunos son servicios online, otros son programas y otros extensiones:

  • Online JSON Viewer: empecemos por un clásico. Este visor de documentos JSON es una herramienta de programación que siempre tengo anclado en la barra de favoritos. De por sí su nombre ya lo dice todo, visor online de JSON, eso es todo, no esperes mucho mas. Viene de puta madre cuando quieres visualizar de una forma mas amigable un JSON. Por lo general yo lo uso copiando en la primera pestaña el contenido del documento y dándole a visualizar en la segunda pestaña aunque también tienes otras opciones como la carga de un fichero, borrar los espacios en blanco, formatear el documento, etcetera… Una de las cosas que mas me gusta de esta web es la forma de mostrar los datos en forma de árbol. La suelo utilizar cada dos por tres.
  • PHP Sandbox: pasemos al lado backend. Esta página te permite correr código PHP directamente desde el navegador. Ayuda mucho cuando quieres probar un snippet y no quieres estar metiéndolo en el proyecto antes de probarlo o tener que tener instalado todo un servidor web para probar pequeños cachos de código. Tiene casi todas las versiones de PHP y van desde la 4.4.9 hasta (en estos momentos) la 7.1.0.  Además tiene una biblioteca de funciones útiles que puedes utilizar a modo de chuleta y que están categorizadas según su tipología. También tiene tutoriales.
  • JSFiddle: Lo mismo que PHP Sandbox pero orientado al frontend. Páginas como esta hay miles pero yo definitivamente la elegí por su interfaz limpia. Te permite probar tus códigos HTML, CSS y Javascript y si te registras puedes versionar y compartir con tus compañeros los snippets que quieras probar. Una de las cosas que mas me gustan de esta herramienta es la transparencia de su roadmap de desarrollo. Tienen un enlace a un tablero púbico Trello (lo puedes ver desde aquí) en el que van anotando todas las mejoras que deberían desarrollar. Olé por ellos.
  • Postman: extensión disponible para Chrome que te ayudará a probar APIs. Pero no solo te permite probar APIs esta extensión, su poder va mucho mas allá y con ella podrás construir, realizar test y documentar todas tus APIs. Entre todas las funciones que tiene, Postman incluye un histórico de peticiones hechas, capacidad para montarte tus propias requests, agrupar tests por proyectos,  automatizar colecciones y en fin, un montón de cosas mas. Si en tu día a día trabajas con APIs y no la conocías ya estas tardando en descargártela 😉
  • PHPStorm: obviamente no podía faltar esta maravilla de la ingeniería. Hablar de las bondades de este IDE daría para una serie de artículos ya que después de un montonazo de años utilizándolo (realmente empecé con IntelliJ Idea) todavía no he descubierto todas sus funcionalidades pero os tengo que decir que debido a sus herramientas integradas, sus plugins y sus atajos de teclado no necesitas mas herramientas de programación para comenzar a realizar tu trabajo. Al principio se que la interfaz es difícil y tira para atrás, pero creedme de verdad, una vez que comencéis a utilizarlo no querréis trabajar con otra cosa, ni Sublime, ni Netbeans ni muchísimo menos Eclipse. Una maravilla vamos.

Faltaría por poner un control de versiones, en mi día a día el único que utilizo es SourceTree de MS….. jajajajaaja NO. Obviamente GIT pero no voy a explicarlo en este artículo ya que me estoy planteando sacar un curso dedicado a el.

Conozco muchísimas alternativas a los puntos anteriores pero después de años dedicándome a esto de los ordenadores, este es el pequeño set-up que me he conseguido construirme.

¿Y tu qué? ¿Conocías estas herramientas? ¿Si, no? ¿Conoces y utilizas otras tal vez? No dudes en dejar tu opinión en los comentarios o en twitter a través del siguiente banner 😉

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a mamarla!

Vagrant, PHPStorm y el nuevo hype de los entornos

Imagina que tienes a tu disposición una herramienta que te monta entornos de desarrollo y en la que no tienes que configurar nada. Imagina que te olvidas de instalar un Apache, un Mysql y PHP en tu ordenador cada vez que formateas. Imagina que ya no tienes que escribir más buildfiles y que puedes desplegar haciendo click en un botón. Imagina que tienes diferentes sistemas operativos y tecnologías instaladas a golpe de comando. Imagina que trabajas en equipo y todos usais el mismo entorno, el “pues a mi no me funciona” dejaría de existir. Imagina…

Parezco John Lennon copón, pero todo esto que te estas imaginando existe en forma de herramienta. Si alguna vez has sufrido lo anterior se te estará haciendo el culo pepsicola tan solo con imaginar. Hablo de Vagrant.

¿Qué es Vagrant?

Logo de Vagrant
Logo de Vagrant

Pues no es nada más y nada menos que una herramienta que cada vez están utilizando más empresas de software y que sirve para virtualizar entornos de desarrollo de una manera super rápida mediante ficheros de configuración. Estos entornos están configurados para que puedan ser usados con los servicios más populares de virtualización como VirtualBox, VMWare o AWS. Según su página web:

Create and configure lightweight, reproducible, and portable development environments.

El corazón de cada instancia es un ficherito que se llama Vagrantfile en el que defines la configuración mínima de la máquina, el sistema operativo y las herramientas que vamos a necesitar.

Una de las grandes ventajas del uso de Vagrant es su integración con herramientas de suministro como Chef y Puppet las cuales se basan en la creación de recetas o scripts que permiten alterar la configuración, instalar de software y mucho más durante el proceso de levantamiento del ambiente.

¿Cómo empiezo?

Para comenzar a utilizar Vagrant vas a necesitar un software de virtualización. Yo soy muy fan de VirtualBox así que el ejemplo irá por ahí, pero vamos, como hemos dicho más arriba, Vagrant no esta sujeto a un solo software. Para instalar VirtualBox escribimos lo siguiente en una terminal.

sudo apt-get install virtualbox-qt

Una vez haya terminado la instalación nos dirigimos a la página web de descarga de Vagrant y seleccionamos nuestro sistema operativo y arquitectura. En mi caso he elegido Linux de 32 bits, esto hará que se nos descargue un paquete .deb que podemos instalar con el gestor de software de Linux.

El proceso de instalación agregará la variable de entorno vagrant a nuestro PATH para que podamos utilizarlo por comandos y para probar que todo ha ido bien que mejor que mirar la versión instalada.

vagrant -v

Configurando Vagrant en PHPStorm

Una Box es la imagen base de una instancia de máquina virtual en la que ya viene preconfigurado todo lo que podamos necesitar, concepto básico en Vagrant. Actualmente ya hay cientos de Boxes predefinidas por lo que tan solo tendrás que buscarla en este listado e instalarla.

Empezando a configurar Vagrant en PHPStorm
Empezando a configurar Vagrant en PHPStorm

Para configurar Vagrant en PHPStorm tenemos que dirigirnos a Settings > Project Settings > Vagrant y se nos abrirá una ventana en la que tenemos que poner la ruta al ejecutable de Vagrant primero y después el directorio en el que estará alojada nuestra instancia. Si lo dejamos en blanco se entiende que se instalará en el directorio del proyecto.

Haciendo click en el botón de Añadir podemos definir nuestra primera box de Vagrant, por defecto PHPStorm nos proveerá con una Ubuntu Lucid Lynx de 32 bits, que no esta nada mal para comenzar, pero podemos definir cualquier otra box tan solo añadiendo su url.

Ubuntu Lucid Lynx por defecto
Ubuntu Lucid Lynx por defecto

Para iniciar Vagrant tendremos que hacer click en Tools > Vagrant > Init in Project Root. Esto creará nuestro VagrantFile, el fichero de configuración que tendrá los detalles de la máquina virtual como por ejemplo la configuración de la IP Virtual, el mapeo de puertos o la memoria a asignar entre otros…

Inicializando nuestro entorno virtual
Inicializando nuestro entorno virtual

Por último, si queremos levantar nuestra instancia de máquina virtual tenemos dos formas de hacerlo, o teclear lo siguiente en la terminal

vagrant up

o hacer click en Tools > Vagrant > Up.

Arrancando nuestro entorno virtual
Arrancando nuestro entorno virtual

Con esto ya tendremos nuestro entorno virtual levantado pero estará pelado. Posteriormente tendrás que instalar todo aquello que necesites como por ejemplo un servidor y una base de datos, a no ser que encuentres una box que incluya todo esto y mucho mas.

Si escribes en una terminal

vagrant ssh

podrás acceder por ssh al entorno recién creado para ir instalando a mano todos los programas o copiar tu proyecto mediante scp, aunque existen otras maneras de hacer un deploy.

Por otro lado, hay varios servicios como PuPHPet que se encargan, mediante una GUI, de generarte un Vagrantfile con todos los programas que puedas llegar a necesitar, es muy intuitivo, tan solo tienes que ir haciendo click en lo que te interese y dejar que el asistente te vaya guiando por cada uno de los pasos.

Para comenzar con Vagrant, esta primera aproximación no esta nada mal. Dejo para más adelante la creación de boxes personalizadas con PuPHPet y el deploy en entornos de desarrollo virtuales.

¡Hasta que volvamos a olernos!

Test funcionales con PHPUnit

Llevo ya un buen tiempo sin escribir, si no recuerdo mal mi última entrada fue del mes pasado y es verdad que los últimos posts se han centrado más en temas de SEO, poquito a poco he ido olvidándome del tema del que se iba a centrar el blog en un principio, desarrollo, que para eso soy desarrollador…

En los últimos 6 meses de mi vida me he visto centrado en un mega proyecto en el que se han pasado las buenas prácticas de programación por el beicon por eso en esta entrada quiero hablar de una metodología que me gusta especialmente y es el TDD o Test-Driven Development, para el que no lo sepa, tests a cascoporro.

¿En qué consiste el TDD?

El desarrollo guiado por pruebas se basa en que antes de ponernos a desarrollar un módulo de una aplicación, primero escribamos una serie de pruebas que por su propia naturaleza cuando las vayamos a correr por primera vez fallarán y a partir de estos primeros fallos, vayamos escribiendo y refactorizando el código necesario para hacer que los tests no fallen. Obviamente esta práctica hará que los plazos de entrega se retrasen pero esto le da una robustez al código y a la aplicación que no conseguiríamos sin tener que ir tirando del ya mítico prueba y error y arreglando los bugs que vayan saliendo hasta dejar estable la aplicación.

Dentro del TDD podemos y debemos hacer dos tipos de test diferentes, por un lado tenemos los tests unitarios y por otra parte los tests funcionales.

  • Test unitarios: se centran en probar una parte atómica de nuestra aplicación como puede ser el envío de emails del módulo mailer o la conexión con la base de datos. Normalmente suelo escribir este tipo de test en el CRUD de cada entidad. Para automatizar la ejecución de los test, podemos engancharlos con sistemas de Integración Continua como Jenkins o TravisCI
  • Test funcionales: este tipo de test añaden complejidad a las pruebas y consisten en probar módulos completos de una aplicación como el registro de un usuario o la compra a través de un ecommerce. Estos test los podemos enganchar con Selenium.

A día de hoy podemos realizar test con cualquier lenguaje de programación de los más utilizados y de hecho existen librerias como NUnit para .Net y Mono, JUnit para Java, QUnit para Javascript o de la que vamos a hablar hoy PHPUnit para PHP. Antes de entrar en el meollo tengo que aclarar que yo soy de los que si están desarrollando una webapp en la que, lógicamente, se utilizan varios lenguajes, me gusta realizar pruebas para todos los lenguajes…

Instalar PHPUnit

Tal y como nos explican en su página web.

PHPUnit is a programmer-oriented testing framework for PHP.
It is an instance of the xUnit architecture for unit testing frameworks.

Tenemos varias formas de instalar phpunit en nuestra máquina y todo dependerá del tipo de proyecto que tengamos y del alcance que queramos darle.

Descarga global

Con este método nos estamos asegurando que tendremos la librería instalada para poder utilizar en cualquier proyecto, es tan sencillo como descargárnosla y moverla a cualquier directorio de nuestro sistema.

$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ sudo mv phpunit.phar /usr/local/bin/phpunit
$ phpunit --version

Descarga en nuestro proyecto

Nos vamos a la raíz de nuestro proyecto y escribimos en una terminal lo siguiente.

$ wget https://phar.phpunit.de/phpunit.phar
$ php phpunit.phar --version

Descarga a través de Composer

Composer es una herramienta que la utilizamos en el desarrollo de aplicaciones web escritas con Symfony aunque no es algo exclusivo, algunos la consideran la versión hiper mejorada de PEAR. Composer es un instalador de dependencias, para el que venga del mundo Java es el Maven de PHP.

Mediante Composer podemos instalar PHPUnit de dos maneras. Si lo hacemos a través de la terminal tendremos que escribir lo siguiente:

$ composer global require "phpunit/phpunit=4.6.*"

También podemos hacerlos añadiendo la dependencia en nuestro fichero composer.json y actualizar, para ello…

{
    "require-dev": {
        "phpunit/phpunit": "4.6.*"
    }
}

Si eres un poco vaguete y no te gusta tirar de código (no sé que haces viendo este artículo sinceramente) tengo otro método que hará las delicias para el que configura sus programas de manera gráfica y es hacerlo a través de las opciones de configuración del PHPStorm.

Para ello nos tendremos que ir a Tools > Composer > Init Composer. Una vez que se haya inicializado hacemos click derecho en el proyecto y seleccionamos la opción de Composer | Add Dependency… y buscamos phpunit/phpunit.

Añadiendo la dependencia de PHPUnit a Composer
Añadiendo la dependencia de PHPUnit a Composer

Una vez que se haya instalado, podremos ver que el directorio vendor, es el que guarda las librerías que necesitará nuestro proyecto, se ha creado un directorio para PHPUnit.

Para que PHPStorm sepa que hemos instalado esta librería y podamos ejecutar los test tendremos que decírselo a través de la configuración global del proyecto, para ello nos dirigimos a Settings > PHP > PHPUnit. Hay varias formas de configurarlo pero lo más fácil es cargando el autoload de nuestras librerías.

¿Desde dónde voy a cargar phpunit?
¿Desde dónde voy a cargar phpunit?

Una vez configurado ya podemos empezar a escribir nuestros test. Esta librería tiene muchísimos métodos para probar cualquier funcionalidad que imaginemos por eso es recomendable que tengas la documentación a mano, pero para que os vaya sonando, un test sencillito se vería tal que así.

    class NotasTest extends PHPUnit_Framework_TestCase{
           public function testAssertTrue(){
                $this->assertTrue(1=1);
           }
           public function testAssertFalse(){
                $this->assertFalse(1=0);
           }
    }

Una vez que ejecutemos estos test, obtendremos algo parecido a lo siguiente.

Los tests han pasado
Los tests han pasado

Con Symfony hay un “problemilla” a la hora de probar el CRUD de nuestras entidades y es que cuando se van a ejecutar las pruebas, el framework todavía no ha cargado el Kernel de la aplicación y por ende el contenedor de servicios no contiene la referencia a Doctrine para poder operar con la base de datos, por ello, yo me he sacado de la manga una implementación de clases base e interfaces que resuelven el problema. Para que se vea con claridad pondré un ejemplo de un proyectillo mio…

Diagrama de mi solución
Diagrama de mi solución

Tal y como se puede ver en el diagrama de la clase base, se hace uso de tres funciones públicas que son necesarias para hacer que esto funciones.

  • Función setUp(): esta función se ejecuta antes de que se ejecute nuestro test, en ella se definen temas de configuración como la carga del kernel y del entity manager. Su ejecución la hace de manera automática la librería liberándonos a nosotros de cualquiera tarea salvo de implementarla y escribir en ella lo que consideremos importante.
  • Función tearDown(): se ejecuta cuando ha terminado de correr nuestro test, normalmente se utiliza para terminar tareas con la base de datos como hacer un flush o un rollback en el caso en que no trabajemos en una base de datos de test.
  • Función getContainer(): como su nombre indica nos devuelve el contenedor de servicios, así de simple.

Voy a dejar el código de cada clase en Pastebin para que podáis pillarlo y utilizar mi implementación en vuestros test pero a cambio os pido que le deis un +1 en Google, un Me gusta en Feisbú o lo compartáis a través de twittah para que así llegue a más personas 😉

[sociallocker id=446]

Descarga clase base

Descarga Interface

Descarga Test

[/sociallocker]

¡Hasta que volvamos a olernos!