Empezando con RSpec

Palabras clave:
Tiempo aproximado: 4 min.

Los que me conocen de cerca saben que siempre estoy intentando aprender cosas nuevas. Es la única manera que conozco para no quedar desactualizado en un sector tan exigente como el nuestro, sobre todo si quieres seguir viviendo de él hasta los 67 o más allá. Y la juventud viene con mucha fuerza. Empieza a dar un poco de respeto ver a gente como @jacegu, @kinisoftware, los @hermanosSoto y otros muchos. Programan en lenguajes que me son completamente desconocidos y están constantemente aprendiendo cosas nuevas. Pero lo peor de todo es que ¡¡tienen mucho tiempo libre!! 😉 Así que no tengo más remedio que ponerme las pilas si no quiero quedar definitivamente arrinconado junto a los libros de “Aprende Java en 15 días” o, peor aún, junto a los de “Guía Práctica de dBase III” (todos enmohecidos y arrugados por el paso de los años). ¡Qué demonios! Hace mucho (muuuuucho) yo programaba en BASIC, en C, en C++, en COBOL, en LISP… así que simplemente porque mi lenguaje para programar en los últimos ¿diez? años haya sido prácticamente sólo uno (Java) no quiere decir que no pueda aprender cualquier otro. Así que vamos a ello. Vamos a aprender otra cosa: por ejemplo, Ruby.

Ya me he hecho las RubyKoans (que, por cierto, las tengo que volver a hacer porque con una sóla vez no me es suficiente). También me he comprado el libro “Programming Ruby 1.9” (pero sólo con comprarlo no es suficiente). Necesito practicar. Y para practicar necesito un mínimo ecosistema. No, no es una excusa: vamos a ver cómo lo voy aprendiendo y construyendo.

RSpec

Entorno: Ubuntu 10.10 + Ruby 1.9.2

Antes que nada he de reconocer que no sé bien qué hice para tener Ruby 1.9 en Ubuntu. El que viene por defecto es 1.8 y yo me lié bastante intentando poner “rvm”. Al final lo conseguí con la ayuda de @ecomba, pero lo cierto es que no sé bien qué hice. #FAIL

Pero si consigues instalar “rvm” el resto es mucho más fácil. Puedes instalar cualquier versión de Ruby y todo el entorno es mucho más controlado.

$ rvm install 1.9.2
$ rvm use 1.9.2
$ rvm gemset create tdd
$ rvm use gemset 1.9.2@tdd --default

Para empezar con RSpec hay que instalar la gema “rspec”.

$ gem install rspec

En ~/.rspec tengo:

--colour
--format documentation

De esta forma se ve mucho mejor el resultado de la ejecución.

Autotest

Con esto ya podríamos empezar con RSpec, pero ya que hay una utilidad llamada autotest que nos permite evitar tener que ejecutar los tests cada vez y, dado que soy muuuuuuuuuuuuuuy vago (como buen programador) 😉

Escribo un poco de memoria y echando mano de mi .bash_history, así que es posible que se me haya pasado algo.

$ gem install autotest
$ sudo apt-get install libnotify-bin
$ gem install test_notifier

En ~/.autotest tengo lo siguiente:

Autotest.options[:quiet] = true
require "test_notifier/runner/autotest"

De esta manera configuro las notificaciones para que aparezcan como una nota emergente, al estilo “growl”. Desgraciadamente no he conseguido en Ubuntu nada parecido a Growl (sólo en Mac) 🙁

Hola Mundo

$ mkdir ejemplo ; cd ejemplo
$ mkdir spec
$ mkdir lib

En spec vamos a poner el test que escribiremos con RSpec
[embed_snipt:wnnG]
En lib vamos a poner el código que escribiremos en Ruby
[embed_snipt:wnny]
Y además en ejemplo/autotest/ hay que incluir un fichero discover.rb que diga:

Autotest.add_discovery { "rspec2" }

De esta manera, autotest puede encontrar las specs y ejecutar rspec sin decirle nada explícitamente.

Arrancamos autotest para no tener que andar ejecutando rspec cada vez. Una notificación emergente me dice “1 example, 1 failed”. Bien. Está funcionando correctamente. En la consola donde se está ejecutando autotest veo:

Rspec Greeter
  should say 'Hello RSpec!' when it receives the greet() message (FAILED - 1)

Failures:

  1) Rspec Greeter should say 'Hello RSpec!' when it receives the greet() message
     Failure/Error: greeting = greeter.greet
     NoMethodError:
       undefined method `greet' for #<RSpecGreeter:0x00000001a48e80>
     # ./spec/greeter_spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 0.00042 seconds
1 example, 1 failure

Editamos greeter.rb para pasar el test.
[embed_snipt:wnnI]
Al guardar la modificación, autotest ejecutará rspec por nosotros y en la ventana donde se ejecuta autotest aparecerá el resultado de la ejecución y una notificación emergente aparecerá en verde indicando que hemos pasado “1 example”, es decir, que se ha ejecutado 1 test correctamente.

Rspec Greeter
  should say 'Hello RSpec!' when it receives the greet() message

Finished in 0.00038 seconds
1 example, 0 failures

De momento sólo estoy conociendo la herramienta. Hay que conocer las herramientas, claro, pero no es lo principal. Tengo que aplicarme con la lectura de “The RSpec Book”, aprender bien cómo usar RSpec y Cucumber y, sobre todo, practicar mucho para escribir buenas especificaciones ejecutables. Ése es mi objetivo. En eso quiero destacar y ser lo mejor que pueda.

Por supuesto, si veis alguna incorrección o tenéis cualquier sugerencia o comentario, estoy deseando leer vuestros comentarios.

FOTO: La imagen que ilustra este artículo es de Enrique Comba y representa el respeto que me dan esos chavales que vienen por detrás pisando fuerte y que, afortunadamente, me estimulan a no relajarme. <ironic_mode>El personaje fotografiado he de reconocer que, afortunadamente, no me suena de nada. Seguro que a @amaliahern tampoco.</ironic_mode>

 

ACTUALIZACIÓN:

La verdad es que ni me acordaba de dónde había sacado la mayoría de la ayuda para configurar. Creía que había sido de Enrique, pero Alberto @sharpbites Rodríguez me lo acaba de recordar. La mayor parte de la culpa de esta configuración tan chula es suya. Lo dicho, ¡¡esta gente dan verdadero miedo!! 😀