Cobertura de código en Ruby

Para esta pequeña guía sobre la cobertura de código voy a basarme en un caso real sobre un proyecto basado en Ruby en la parte servidor y Javascript en la parte cliente (SOUI/FEA). 

En la parte de Ruby, que es la que se quiso inspeccionar, se tienen diversas baterías de test como los unitarios, los de integración y otros de API y funcionales mediante Cucumber.

Partiendo de esta base, se quiso añadir al proceso de integración contínua alguna herramienta de cobertura de test para poder ver el alcance de lo que estaba cubierto por test.

En este punto, cabe destacar que los test funcionales y/o de API no iban a formar parte de esta inspección de cobertura ya que son llamadas HTTP a métodos remotos (o locales) y nos sería imposible inspeccionar qué código ejecutan.

Así pues, tendríamos que inspeccionar el código de test de los unitarios y de los funcionales.

Empezaremos primero con el fichero Rakefile del proyecto, viendo qué tareas tenía y cómo fue evolucionando para integrar la cobertura.

Las tareas de test están separadas por comodidad en el desarrollo

RSpec::Core::RakeTask.new(:spec)do |t|
    t.pattern = "test/unit/*_spec.rb"
    t.rspec_opts = "-Ilib -c"
end

RSpec::Core::RakeTask.new(:integration)do |t|
    t.pattern = "test/integration/*_spec.rb"
    t.rspec_opts = "-Ilib -c"
end

RSpec::Core::RakeTask.new(:services) do |t|
    t.pattern = "test/services/*_spec.rb"
    t.rspec_opts = "-Ilib -c"
end

y después, para la integración contínua para el Jenkins, se tiene otra que
va llamando una tras otra estas tareas de test más las de Cucumber

task :all_specs do
	ENV['RACK_ENV'] = 'production'
	Rake::Task['server_up'].execute
	Rake::Task['spec'].execute
	Rake::Task['integration'].execute
	Rake::Task['services'].execute
	Rake::Task['features'].execute
	Rake::Task['server_down'].execute
end

Este es el escenario que se tiene antes de la implementación de la cobertura.

Tras mucho probar con todo tipo de gemas y otras sandeces como ‘rcov cover_me etc’, por problemas de compatibilidad de contexto entre Rakefile y el código ‘etc etc’, lo mejor que he podido montar ha sido con una gema llamada

simplecov

la cual permite salida tanto en HTML como en formato rcov.

Lo primero fue poner en el Gemfile las gemas necesarias al final del fichero

gem "simplecov", "0.5.4"
gem "simplecov-html", "0.5.3"

Las versiones son las últimas en el momento de escribir este artículo. También
indicar que si se quiere salida en formato rcov tambien tendría que añadir la gema

simplecov-rcov

Una vez hecho esto las instalamos

sudo bundle install

Y una vez instalamos, continuamos.

Tenemos nuestras tareas en el Rakefile, nuestras gemas de cobertura y ahora ya empezamos a montar todo el tinglado.

Tras darme de frente mil veces intentando lanzar la cobertura desde el Rakefile antes de ejecutar los test, me di cuenta que la única forma era polucionar un poco los test. Para lo cual me creé un directorio en raíz del proyecto llamado

resources

con un fichero llamado

proyecto_coverage.rb

el cual contiene los require de simplecov y la llamada necesaria para que empiece
la inspección

require 'simplecov'
require 'simplecov-html'

SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
SimpleCov.start do
    add_filter "test"
end

En este fichero indico que la salida será en HTML y que ignore todo lo que contenga la palabra test.

Este fichero me obligaba a modificar mis tareas de test para incluir en su INCLUDE DIR la ruta de mi nuevo directorio resources y además creé una nueva tarea que sólo lanzará los tests que yo quería que fueran cubiertos. Así pues, las tareas de test fueron modificadas

RSpec::Core::RakeTask.new(:spec)do |t|
    t.pattern = "test/unit/*_spec.rb"
    t.rspec_opts = "-Iresources -Ilib -c" #<- EL CAMBIO (-Iresources)
end

RSpec::Core::RakeTask.new(:integration)do |t|
    t.pattern = "test/integration/*_spec.rb"
    t.rspec_opts = "-Iresources -Ilib -c" #<- EL CAMBIO (-Iresources)
end

RSpec::Core::RakeTask.new(:services) do |t|
    t.pattern = "test/services/*_spec.rb"
    t.rspec_opts = "-Iresources -Ilib -c" #<- EL CAMBIO (-Iresources)
end

y la nueva tarea

RSpec::Core::RakeTask.new(:coverage)do |t|
    t.pattern = "test/{unit,integration}/*_spec.rb"
    t.rspec_opts = "-Iresources -Ilib -c"
end

Con todo esto hecho, sólo me quedaba modificar la tarea que se lanzaba desde el Jenkins como sigue

task :all_specs do
	ENV['RACK_ENV'] = 'production'
	Rake::Task['server_up'].execute
	Rake::Task['coverage'].execute
        Rake::Task['services'].execute
	Rake::Task['features'].execute
	Rake::Task['server_down'].execute
end

y en cada uno de los ficheros de test, tanto unitarios como de integración, añadir como primera línea el require de mi fichero de cobertura:

require 'proyecto_coverage'

Con esto hecho bastaria con ejecutar la tarea

rake coverage

y ver que nos creaba un directorio llamado

coverage

con un bonito HTML navegable de forma estática.

A modo de ejemplo, decir que nosotros desplegamos este HTML con cada ejecución del Jenkins en un servidor de integración continua para poderlo ver con cada commit del Git.

Happy covering :)

Entradas Similares

Problema con Sinatra Imagemagick Rmagick en Mac

Undefined method `dirname’ for Rack::File:Class

Instalación y configuración sistema de integración contínua Jenkins con autorización HTTP basic Tomcat

Curso de desarrollo ágil

Hace ya más de un año, en uno de esos eventos cuasi-familiares que organizamos en beCode, Ricardo nos hizo una propuesta a Emma, Xavi y a mi ¿montamos un curso de desarrollo de software en la UJI? 

Pues bien, desde hace unas pocas semanas ya lo estamos impartiendo, y estamos muy contentos.

El objetivo principal del curso es que los alumnos aprendan que hay otra manera de desarrollar software, una manera que no se enseña en las universidades, que se practica en pocas empresas y que te miran raro si hablas de ello. Exactamente los mismos principios que difundimos en nuestro día a día.

clase xavi
Xavi hablando de equipos autoorganizados

 

Con respecto al contenido del curso, cada uno de nosotros se ocupa de un área específica: Xavi de metodología de gestión, Ricardo de las herramientas, Emma del código y yo del testing, que se vertebran alrededor de un proyecto. Las áreas se imparten iterativamente terminando cada iteración con un coding dojo para dar el espacio a la práctica deliberada.

Ricardo en la clase
Ricardo en la presentación del curso
Clase de Emma
Emma explicando fundamentos de OOP

Ahora que la educación está en boca de todos y que nos quejamos continuamente de nuestra industria es hora de hacer cosas, este es nuestro granito de arena.

La inauguración oficial de la nueva cueva

Nos ha llevado un par de meses, pero la nueva madriguera ya está lista! Como buenos amantes del “Do It Yourself” nos hemos puesto sombreros de albañiles, electricistas, fontaneros, pintores… para darle una buena lavada de cara al que a partir de ahora será nuestro nuevo centro de operaciones =)

Muchos nos han preguntado en qué consisten estas “operaciones”… Bueno, básicamente seguiremos haciendo lo que hacíamos antes: lo que nos divierte. La nueva cueva se presta a ello. No será raro ver a la gente de siempre trabajando por aquí y también nuevos fichajes. Habrá disputas por las herramientas del taller para arreglar una bicicleta o montar un mueble hecho con materiales reciclados. O quizá habrá que colgar el cartel de “Aforo completo” cuando hagamos un Coding Dojo, algún taller, charla o fiesta de inauguración ;)

 

Hemos puesto un deadline para definirnos. Ya han sido muchos los que nos han preguntado acerca de nuestra nueva etapa… Incluso los vecinos del barrio teorizan sobre “lo que somos”. Así que el jueves 26 de abril a partir de las 19:00 h. os esperamos en La Guarida de beCode para compartir con vosotros, como no, cerveza, papas y la música de @CarlosDuet y @luislitze hasta que los vecinos llamen a los “bedeles con pistola”.

beCode

C/ Francisco Martínez 2, bajo dcha.

46020 – Valencia

 

Desksurfing Agil-AZ

Durante la semana de fallas Emma y yo estuvimos visitando por enésima vez una de nuestras capitales preferidas: Santiago. Esta vez con la excusa de pasar unos días en Agil-AZ con los amigos Pepe y Pablo. Como contamos en un post anterior, nuestra idea se enmarcaba dentro de la iniciativa desksurfing y la intención era compartir con ellos su día a día en la oficina, aunque terminamos compartiendo muchísimo más.

El día a día en la oficina

Pepe y Pablo trabajan en una oficina a las afueras de Santiago, es grande, muy confortable, luminosa y con unas vistas preciosas. Tienen un horario muy flexible y un ambiente agradable.

La verdad es que no teníamos preparado nada especial para trabajar conjuntamente, el primer día nos reunimos para ver en que podríamos colaborar y Pablo y yo sacamos varios puntos en común: Pablo esta muy interesado en aprender Ruby, un lenguage con el que estoy familiarizado y tenía un pet project muy goloso para empezar, así que trabajamos un par de días en una pequeña aplicación para generar cartones de bingo, dada la sencillez de la lógica es perfecto para una kata, que estrenaremos en el próximo coding dojo en beCode.

Emma por su parte estuvo entretenida en su proyecto personal y recibió buen feedback.

El puesto de Carlos
Carlos rodeado de cacharros, casi no puede mover el ratón
elmenda y pablo programando
MA y Pablo programando un rato
Pepe en videoconferencia
Pepe muestra su mejor cara en un hangout
En la misma oficina con Agil-AZ trabajan también sus amigos, con los que forman Karapatrov. Son unos chicos que no se dedican en absoluto al desarrollo de software :) están más cerca del mundo audiovisual con lo que tienen todo el espacio lleno de cachibaches. Esta mezcla de profesionales de distinto perfil crea unas conversaciones y proyectos realmente interesantes, de hecho nos trajimos una colaboración para un proyecto con ellos.

Uno de los días lo empleamos en visitar una empresa gallega interesada en desksurfing, Quobis, nos pusimos en contacto con Iago que fué muy amable y nos acercó a O Porriño. Se dedican sobre todo a las telecomunicaciones pero tienen un pequeño departamento de desarrollo a los que echamos una mano durante una mañana en algunas tareas de Java en las que podíamos aportar nuestra experiencia.

El arte de la hospitalidad

Si tuviera que resumir el desksurfing en una palabra sería hospitalidad. El día a día de oficina solo fue una mínima parte de la experiencia desksurfing.

Pepe nos prestó una habitación en su casa en Santiago y también fuimos a visitar el pazo donde vive Pablo, un sitio increíble, rodeado de bosques y con un maravilloso paseo a la orilla del rio.

En la cocina de pablo
Programando en la cocina de Pablo
Paseo por el campo
El hurañismo va a llegar
ribera del rio
Esto ve Pablo cuando sale de casa por las mañanas
Fuimos a los mejores sitios de comida en Santiago y probamos las especialidades de la región en esos restaurantes escondidos de los turistas.

Conocimos a un montón de gente: los amigos Karapatrov, entre ellos Xavier y Carlos, Fer con el que tuvimos una agradable cena, Mónica, Iago … . Ya el primer día que llegamos nos apuntaron a una fiesta en Casa das Crechas.

Amigos

Lo mejor de todo fue compartir momentos con los chicos de Agil-AZ, innumerables conversaciones sobre lo que nos une y nos separa, sobre desarrollo de software y agilismo por supuesto, pero también sobre costumbres, personas y maneras de ver la vida.

Nos dejamos bastantes anécdotas por contar, la mayoría ocurridas en bares, pero este post ya se va haciendo largo.

Para terminar nos gustaría agradecer a todos los que hicieron posible esta gran experiencia y en especial a Pablo y Pepe. Ellos han forjado un ambiente de trabajo basado en su estilo de vida que nosotros tuvimos la suerte de compartir, y del que ya nos sentimos parte.

Coding Dojo el 24 de abril

Coding Dojo beCode en Valencia

 

beCode convoca a todos los interesados al próximo Coding Dojo. Se trata de una reunión entre programadores para trabajar conjuntamente resolviendo problemas, y así aprender los unos de los otros.

Celebraremos el Coding Dojo en la nueva guarida de beCode. Empezaremos a las 18:30 h, la idea es dedicar dos slots de 45 minutos a la kata, así que durará más o menos hasta las 20:00.

Recordad que el Coding Dojo es una reunión abierta. Programadores, aprendices, interesados y curiosos. Todos tienen un hueco. Abstenerse aquellos sin ganas de programar y divertirse haciéndolo.

Esta vez desarrollaremos un generador de cartones de bingo, es un ejercicio sencillo pero que tiene su miga.

Para hacernos una idea de cuántos seremos, mandad un e-mail a mike@becodemyfriend.com confirmando vuestra asistencia. Y si tenéis alguna duda o sugerencia, poneos también en contacto con nosotros en el mismo mail.

Recordad, el día 24 de Abril a las 18:30 en beCode. Os esperamos no faltará la bebida, el buen ambiente y la discusión sana.

¡Nos vamos a Santiago!

Un pedazo de beCode  se va de excursión a terras galegas. Miguel Ángel y Emma van a devolver la visita de Pepe y Pablo y conocer Agil-AZ in situ. Aprovecharán para conocer gente y crear nuevos contactos y trabajarán en remoto con el resto del equipo. No sabemos si irán a abrazar al santo o en busca de la Santa Compaña pero seguro que vuelven con morriña.

Si quieres conocernos y charlar un rato sobre tecnologías, startups, programación, agilismo… y te pilla cerca Santiago de Compostela del 14 al 21 de marzo, mándanos un email!

mike at becodemyfriend dot com
emma at becodemyfriend dot com

 

Un desksurfing en Barna

Esta semana termina mi cuarto desksurfing. Esta vez me he desplazado hasta Barcelona para estar con los chicos de Aventia durante una semana. 

Cuando entras en Aventia lo que primero te llama la atención es la cantidad de paneles con post-its que tienen. Y pensar que todo empezó hace un año gracias a Javier Gómez con un mini tablón…

Enseguida te das cuenta del gran equipo humano que hay. Gente que se siente piña, que participan de comidas, almuerzos, salidas comunes. Un buen germen para generar cultura de empresa.

Están empezando a andar el camino agile y para auxiliarse han contado esta semana con un curso de TDD de Carlos Ble: Conceptos SOLID y Testing, pero sobre todo atención a la nomenclatura y duplicidad.

Este desksurfing me ha aportado la visión de una empresa consultora que quiere ser ágil, que entiende que este es el camino, pero tiene dudas, comete errores, tiene muchos frentes abiertos y aún arrastra lastres como la frase “no tengo tiempo”. Les he planteado los puntos donde he visto más ROI, donde con mínimo esfuerzo puedan ver más ganancia, gastar menos energía y ver resultados a corto plazo tanto en metodologías como tecnologías. Les he alentado a que sean curiosos, que conozcan otros puntos de vista, que exploren distintas alternativas.

Pero me llevo la sensación de que no me han aprovechado todo lo que podrían haberlo hecho. Aunque es una sensación típica en un desksurfing – te preocupa dar tanto como al menos recibes, en este caso quizá se acentúe al no haber podido realizar ninguna actividad conjunta, excepto el daily meeting.

Mención aparte para el equipo de Renacimiento, Quique, Pablo y Fernando tienen un nivel de excelencia técnica envidiable: poseen un conocimiento profundo sin perder la curiosidad por cómo “ocurre la magia”. ¡Hay una simbiosis clara que espero no tarde en ocurrir!

La vuelta a los orígenes

Hace casi un año empezamos una aventura empresarial y vital

La premisa básica era hacer proyectos interesantes con más talento que dinero en nuestra ciudad. Para ello formamos beCode. Buscamos un modelo que fuera compatible con nuestra forma de ver los negocios y la vida en general y comenzamos nuestra andadura buscando atraer esos proyectos interesantes…

Llegó un momento en que o incubábamos proyectos o trabajábamos para terceros. Así, a la vuelta de un viaje (las grandes decisiones parece que siempre las tomamos cuando salimos de viaje), decidimos arrancar con YarakSeed y una estrategia que nos permitiera dedicarnos plenamente a los proyectos.

Le pusimos todo nuestro empeño pero no ha funcionado.

Podríamos jugar al lloriqueo,  que este país es un blablabla… que son tiempos de crisis, que los inversores no tienen ni f*****g idea y todo eso, pero la verdad es que no hemos sido capaces. No hemos conseguido ser lo bastante atractivos para la inversión, supongo que no damos bastante confianza con nuestra incubadora punk y nuestro innovador club de inversión.

Así pues, cambiamos, pivotamos, mutamos

Seguiremos trabajando en nuestros productos y mantenemos nuestra actividad incubadora con los que ya están dentro. Por lo demás, todo cambiará para seguir siendo exactamente igual.

Mantenemos YarakSeed. Lydia, el mejor descubrimiento de este año, ha adaptado el modelo de Club y seguirá siendo el nexo entre proyectos y la financiación.

Nos mudamos a otro espacio, más grande y adaptado a nuestras nuevas necesidades, un espacio donde vivir y reunirnos, un espacio donde seguir acogiendo a cualquiera que quiera ponerse a hacer cosas, un lugar vetado para los singermorning, mareantes y wannabes, pero la madriguera adecuada para soñadores, guerrilleros y aprendices de cualquier tipo. Un lugar donde tanto se construirá una bicicleta como una impresora 3D, donde se harán desde cursos de costura hasta de programación para padres e hijos, donde se celebrarán coding dojos y se manufacturará el código más bonito que hayan visto vuestros ojos.

beCode se abre a quien desee ser beCode y compartir sus valores. beCode será un espacio abierto al talento como ha venido siendo desde que nació. Este artículo es la invitación para todo aquel que quiera acercarse, proponer, trabajar y divertirse.

Coding Dojo beCode en la UPV el 21 de febrero

Coding Dojo beCode en Valencia

beCode, VlcTechHub y la Escola Tècnica Superior d’Enginyeria Informàtica (ETSINF) convoca a todos los interesados al próximo Coding Dojo, se trata de una reunión entre programadores para trabajar conjuntamente resolviendo problemas y así aprender unos de otros.

En esta ocasión haremos un coding dojo muy enfocado a estudiantes con nociones básicas de programación. Repasaremos la recursividad creando una lista enlazada. ¡Acordaros de traer portátil con vuestro IDE preferido configurado!

En esta ocasión será un Coding Dojo para estudiantes en las instalaciones de la ETSINF. En el aula 0.0 del Edificio 1E.

Empezaremos a las 19:00, la idea es dedicar dos periodos de 45 minutos a la kata, así que durará mas o menos hasta las 21:00.

A pesar de que enfoquemos este Coding Dojo a estudiantes, no deja de ser una reunión abierta. Programadores, aprendices, interesados y curiosos. Abstenerse aquellos sin ganas de programar y divertirse haciéndolo.

Para tener una idea estimada de cuantos seremos, mandad un email a mike@becodemyfriend.com indicando vuestra asistencia. Si tenéis alguna duda o sugerencia también os podeis poner en contacto por el mismo email.

Recordad, el día 21 de febrero a las 19:00 en la ETSINF. ¡Os esperamos!

Backup de máquinas virtuales automático en Proxmox

Aquí os dejo un script para hacer backup de todas las máquinas virtuales en Proxmox, manteniendo un número determinado de ellas.

Este script debe dejarse en el cron de modo que se lance de madrugada, por ejemplo.

#!/bin/sh

RUTA_DUMPS="/var/lib/vz/dump/"
MAXIMO_COPIAS=5

for VZ_ID in `vzlist -1` ; do

    VZ_HOSTNAME=`vzlist -o hostname -H ${VZ_ID}`
    VZ_IP=`vzlist -o ip -H ${VZ_ID}`
    VZ_DUMP="/var/lib/vz/dump/${VZ_HOSTNAME}_"`date '+%d%m%y%H%M%S'`".tgz"    

    echo ""
    echo "vzid ${VZ_ID}"
    echo "host ${VZ_HOSTNAME}"
    echo "ip.ad ${VZ_IP}"
    echo "dump ${VZ_DUMP}"
    echo ""

    #: descartando copias viejas
    TOTAL_COPIAS=`ls ${RUTA_DUMPS}${VZ_HOSTNAME}* | wc -l`
    NUMERO_DESCARTADOS=`echo "${TOTAL_COPIAS} - ${MAXIMO_COPIAS}" | bc`
    DESCARTADOS=`ls ${RUTA_DUMPS}${VZ_HOSTNAME}*  | head -n ${NUMERO_DESCARTADOS}`
    for descartado in ${DESCARTADOS} ; do rm -f $descartado ; done

    #: backuping
    vzctl set ${VZ_ID} --ipdel all --save
    cd /var/lib/vz/private/${VZ_ID}
    tar cvzf ${VZ_DUMP} .
    vzctl set ${VZ_ID} --ipadd ${VZ_IP} --save

done

Entradas similares:

Instalación y configuración de un sistema de integración contínua Jenkins con autorización HTTP basic Tomcat

Instalación y configuración de un servidor de integración contínua con soporte PHP

Migración de un repositorio Subversion a Git