Semanas 404 y 405

Ya estamos, casi como de costumbre, haciendo retro quincenal otra vez. Esta vez mi excusa es haber estado una semana de vacaciones, o de medio vacaciones, ya que la excusa de mis vacaciones era ir a Londres para asistir como voluntario a uno de los eventos sobre software más importantes de europa como es la QCon London. Y como era mi primera vez ahí quise aprovechar también para hacer bastante turismo y ver a algunos amigos del mundillo que andan por tierras británicas.

No sé si podré sacar un rato para escribir sobre el evento, ya que quiero volver a ver algunos videos de charlas de las que me perdí algunas partes por el trabajo como voluntario, pero intentaré hacerlo en algún momento.

La semana anterior, además de trabajar aún sin total normalidad (por andar todavía algo pachucho), saqué tiempo el viernes para ir al Friday Dojo sobre Jenkins. Además andamos en mitad de mudanza del estudio, aunque por ahora mi aportación ha sido muy poco y son mis compañeros los que se están haciendo cargo de casi todo.

Mientras que sobre proyectos:

  • En OutreachTool estuve implementando cambios y añadidos en la tienda, además estuve actualizando algunas gemas.
  • Con Coding Stones estuvimos revisando lo que un cliente nos ha pasado para empezar a trabajar en la definición de historias de usuario, vimos que tenemos bastante trabajo respecto a esto.
  • Hice algunas mejoras en Mosica para ver si le conseguimos gustar un poquito más a google, además resolví un bug con la generación de algunos ics que daban problemas.
  • Con Maubic estuvimos trabajando en un servicio nuevo, además de dando soporte y haciendo mejoras en otro de ellos; estas semanas me toca pisar un poco el acelerador con ellos. También perdí algo de tiempo en dejar listas algunas cosas en un jenkins.

Buena semana.

Semanas 402 y 403

De nuevo resumen de 2 semanas. La segunda me la he pegado prácticamente KO por un trancazo bastante gordo que no me ha dejado avanzar lo que me hubiera gustado, incluso tuve que dejar aparcada temporalmente alguna cosa hasta nueva orden.

Y es que aún ando bastante renqueante tras tantos días con fiebre, así que he dejado bastante escueta la retro:

  • Con Maubic estuve principalmente dándoles soporte en temas de backend y dedicando tiempo para la resolución de algunos problemas que fueron surgiendo.
  • Estuve a varios flancos con OutreachTool, tanto a nivel de desarrollo como de coordinación. Ya hay buena parte del rediseño hecho y hay que empezar a integrarlo en la web.
  • Tuvimos reunión de puesta al día de Bichomanía para alinear visiones. Además me tocó hacer algún pequeño arreglo.
  • A Mosica le dediqué un poquito de tiempo para hacer un par de cambios chorras. También aproveché para empezar a probar una herramienta de analítica de usuarios.
  • Con los CodingStones estuvimos haciendo trabajo de definición y revisando algunas cosas hechas por el equipo. Además, a falta de las formalidades, parece que a no mucho tardar vamos a trabajar por fin en un proyecto de cierta entidad.

Buena semana.

Page Objects con PHPUnit y Webdriver

A finales del año pasado me llegó la posibilidad de colaboración a modo de consultoría con Funidelia, un comercio electrónico de disfraces. Un comercio electrónico que además va como un tiro, por cierto.

Me contactaron para echarles una mano para empezar con el testing funcional (o de sistema, o end-to-end, o...). Ya que al parecer intentaron en el pasado ponerse con ello pero, como ocurre en muchas ocasiones, el día a día de una startup no permite que el equipo técnico pueda focalizarse en ello.

Así que tras una reunión inicial y alguna otra conversación teníamos claro que mi papel era sentar unas bases sobre las que ellos pudieran seguir.

¿Cuáles eran esas bases?:

  • Implementar casos los tests automáticos para la parte más crítica del negocio: los diferentes puntos dentro del proceso de compra.
  • Saber cuanto antes cuando se rompe un test. Así que se pueda lanzar correctamente desde un servidor de integración continua (que en su caso era un jenkins) sobre entornos de desarrollo.
  • Además del entorno de desarrollo que pudieran lanzar contra entornos de staging, o incluso producción. Teniendo en cuenta que la misma base de código del comercio electrónico se ejecuta en diferentes instancias y configuraciones (por país).
  • También se debían lanzar los tests con diferentes navegadores, es crítico que funcione correctamente con todos lo navegadores mayoritarios.
  • El lenguaje de programación a utilizar iba a ser PHP, ya que es el utilizado por el equipo.

Una cosa que estuvimos hablando fue el que los tests sólo cubrirían los escenarios optimistas del proceso de compra, esto es cuando se supone que al usuario todo le va bien y termina con su compra de disfraces hecha. No sólo para lo que yo iba a hacer, si no también para cuando el equipo siguiera evolucionando las baterías de tests. Al final son tests lentos, frágiles y mantenerlos tiene bastante coste, pero luego volvemos a ello.

Las herramientas:

Hacía mucho que no programaba en PHP y no estoy para nada al día de sus novedades, pero para esto estábamos de acuerdo que no creíamos que iba a ser un gran problema.

Aunque no estuviera muy al día sí tenía referencias de cosas como composer para gestionar las dependencias y era el punto de partida.

En cuanto al framework de testing se me pasó un momento por la cabeza el cacharrear con behat, pero como al final iban a ser tests sólo para los programadores me parecía añadir una indirección que no aportaba nada; así que tiramos a lo seguro con PHPUnit, que ir con algún framewrk xUnit es ir sobre seguro.

Para el lanzamiento de acciones de navegador también tenía claro la elección con Selenium Webdriver y el cliente PHP implementado por la gente de facebook.

Mientras para que para el soporte de ejecución frente a diferentes entornos, monté algo de código a medida para poder cargar configuraciones de ficheros json a partir de un parámetro enviado al comando de ejecución de la batería de tests.

Page Objects:

Y ya respecto a los propios tests, como escribía algo más arriba, los funcionales suelen ser considerados frágiles y lentos.

Decimos lentos para el contexto de que no nos sirven para dar feedback rápido de si algún cambio que hayamos introducido en el código ha roto algo, si los intentas usar para ello serán una tortura para tu flow. Si a alguno no le suena la Pirámide de Test siempre puede informarse de ello en la web de Fowler.

Pirámide de Test

Y decimos frágiles principalmente porque cualquier cambio de maquetación html por pequeño que sea puede romper el test: un texto, un class, un id... Así que, salvo que la UI no evolucione, suelen resultar caros de mantener frente a otros tipos de tests.

Una forma de abaratar bastante el mantenimiento de esos tests es el uso Page Objects. De modo que para cada página (aunque también podríamos tener Page Objects de elementos comunes, como quizás un menú de navegación) que queremos que participe en los tests abstraeremos sus detalles de implementación para utilizarlo como un objeto en cada caso de test, reduciendo de esta manera la duplicidad de código y mejorando la legibilidad de los propios tests.

En los Page Objects expondremos tanto métodos que crean/llevan a otros Page Objects como otros que lanzarán acciones para que sean ejecutadas en el navegador (un click, completar un formulario...) y de los que opcionalmente esperaremos algo en el retorno.

Además en mi caso implemento los Page Objects con la responsabilidad de los asserts en el propio Page Object. Ahí decido lo mucho o poco que quiero acoplarlo a la maquetación exponiéndolo como un assert con un lenguaje más de negocio. Esto lo comento porque al implementar Page Objects existen 2 vertientes ligeramente diferentes: incluir los asserts o proveer un modo para que el test sea el responsable de cómo se le hacen los asserts y así separar responsabilidades. El propio resumen final que enlazo, por lo general, desaconseja lo asserts en estos objetos; aunque a mi por el momento no me ha resultado problemático el hacerlo y se adapta más a mi gusto.

Y ya desde un punto de vista más práctico y sin meterme en detalle, este es como quedaría test de añadir un producto al carro de la compra:

Como se puede ver en el código, se mantiene encapsulado entre esos objetos. Podría cambiar completamente la maquetación de la UI y tendríamos que cambiar sólo la implementación de los Page Objects (que no es poco). Otro tema es que, por razones de diseño o negocio cambiara la lógica de navegación, claro.

Semanas 400 y 401

Un par de semanas algo duras estas 2 últimas, se han juntado algunos temas que las han puesto bastante cuesta arriba. No me vendrían mal unas vacaciones de las de verdad, no.

Desde Cachirulo Valley empezamos a coordinarnos y a trabajar en el próximo Startup Open Space. Además yo estuve presentando el colectivo y el evento en formato elevator pitch en el Startup Europe Week que se celebró en Zaragoza.

Algo a destacar de estas semanas es que hemos anunciado lo último en lo que llevo un par de meses embarcado, los Coding Stones (la web es temporal, pero había que lanzar algo ya). Una marca bajo la que estamos varias personas que llevamos bastante tiempo en esto del desarrollo de software y que queremos trabajar juntos, además que estamos convencidos de que aportamos más valor a nuestros clientes en conjunto que contratados individualmente.

Estuve en la presentación de Españopoly en Zaragoza. Y luego estuvimos tomando algo por ahí con David y Eva, buena gente de la Fundación Civio.

Para acabar esta última semana, este fin de semana me dio por extraer un pequeño plugin de JQuery para galería de fotos desde el proyecto de Alchups.

Estas semanas también tocó gestionar algún que otro lead, y hacer una primera reunión para conocer con mayor profundidad el proyecto de uno de ellos, además:

  • Dejamos listos algunos cambios en Bichomanía, principalmente relacionados con la arquitectura de información de la home.
  • Para Maubic estuve a temas variados. Los que me llevaron más tiempo fue dejar configurado un Jenkins listo para lanzar las builds de todos los proyectos, y montar un servicio de logging centralizado para los diferentes servicios.
  • Tuvimos la reunión de arranque para el proyectito con Refinery.
  • A Outreach Tool estuve dedicándole algunos ratos, además de hacer algo de soporte y coordinación.

Buena semana.

Alchups.com: Los aljibes de San Esteban

En Octubre anunciábamos el lanzamiento de la web Alchups.com, y hace meses que tenía un borrador de post sobre ello que fue cayendo en el olvido, hasta hoy. Sin ser la tipología de proyecto que haga, ni a la que quiera dedicarme a hacer habitualmente, era algo que venía de lejos y es un proyecto que me hizo mucha ilusión que viera la luz.

Hace mucho que empezábamos a hablar con Javier Viudas sobre la necesidad de documentar y dar a conocer todos los alchups (o aljibes) que hay en nuestro pueblo en una web, y al final han tenido que pasar algunos años para que esta idea que teníamos en nuestras cabezas haya podido hacerse realidad. Tenía bocetos en papel hechos y re-hechos desde hacía la tira, y antes de verano pudimos plantearnos desarrollarlo por fin.

Como se explicó a algunos medios comarcales, pudimos ejecutarlo enmarcado dentro del proyecto de limpieza y señalización de las rutas de alchups, gracias a una ayuda de la Diputación Provincial de Huesca al Ayuntamiento de San Esteban de Litera.

Como es de suponer, en este proyecto me tocó hacer un poco de todo: conceptualizar, coordinar y desarrollar.

Para conceptualización estuvimos trabajando con José Luis Lizano. Al tener mucha libertad por parte del cliente, una visión clara del proyecto y una idea bastante aproximada de los contenidos con los que íbamos a poder trabajar; pudimos avanzar bastante rápido directamente sobre bocetos en papel.

Así que partir de estos bocetos él ya pudo hacer el trabajo de diseño visual.

Una foto publicada por Dani Latorre (@danilat) el

En paralelo con Razvan Puscas empezamos a programar, principalmente la parte de gestión de contenidos. El backend lo implementamos con Ruby on Rails ayudándonos de algunas de las gemas habituales como devise, rspec, factory_girl o paperclip. Mientras para maquetar el gestor de contenidos utilizamos Twitter Bootstrap y añadimos mapas de Google Maps.

Cuando ya tuvimos cerrados los primeros PSDs, entró a echarnos una mano para hacer la maquetación de la web pública Guillermo Latorre (antes de ser nombrado CEO :)). Sass, Bourbon, Restive...

Una foto publicada por Dani Latorre (@danilat) el

Con eso quedaba unir el trabajo de todos y finiquitar detalles para empezar con la carga y gestión de contenidos.

La mayor parte de la aplicación encajaba bien con la rails way y resultó muy rápido de implementar, pero además tuvimos que hacer algunas cosillas un poco raras. Para la carga inicial de datos tuvimos que importar ficheros CSV y transformar las coordenadas desde UTM a latitud/longitud. Mientras que para pintar las rutas y el término municipal en el mapa escribimos un parser de KML para luego pasarlo a JSON/JS y poder usarlo con Google Maps.

En cuanto al despliegue, lo tenemos hospedado en heroku y para le almacenamiento de imágenes utilizamos Amazon S3.

Al ser un proyecto financiado con fondos públicos es norma de la casa el hacerlo en abierto desde el principio. Así que el código está disponible para el que quiera utilizarlo o para quien quiera conocer nuestras vergüenzas en más detalle en un repositorio de github. La licencia elegida fue la Affero GPL.

Así que nada, si un día os pasáis cerca de San Esteban de Litera, os propongo ese plan :)