Empezando con RSpec

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 , , los 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 , pero lo cierto es que no sé bien qué hice.

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 --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

En lib vamos a poner el código que escribiremos en Ruby

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.

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 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 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!! 😀

  • Veo que al final no usaste (¿leíste?) mi post.

  • jmbeas

    Sí, lo que pasa es que no te he dado los créditos correspondientes en el post. 🙂
    Fíjate que he usado lo del gemset (lo he plagiado directamente aunque no me acordaba siquiera que había sido de ahí).

  • Vale, jeje. Lo decía porque ahí comentaba también como usar test_notifier para tener notificaciones a la growl.

  • ¿Gracias por la foto? jejeje, voy a tener que tener cuidado con mis derechos de imagen 😉

    La verdad es que me siento exactamente como indicas en el primer párrafo, veo gente muy joven que vienen con mucha fuerza y ganas y también hay gente no tan joven con ese espíritu…y damn it!!! de dónde sacan tiempo para todo???

    Es increible, a veces me agobio al no llegar a tooooooodo lo que me gustaría hacer, pero ese sera el truco: priorizar sobre todos los temas y trabajar duro en los que en cada momento acometas.

    Ánimo con Ruby, RSpec y toda la familia…quizás algún día esos temas suban en mi pila de prioridades, ahora están en la lista de “Algún día”

  • Hola.

    Mogollón de cosas:

    Para obtener notificaciones en ubuntu:
    # apt-get install inotify-tools
    Y ya puedes utilizar notify-send (aunque te advierto que en ubuntu 10.10 tiene un bug y siempre verás el mensaje durante unos 14 segundos).

    Además, yo estoy usando ruby 1.9.1, sin utilizar rvm. Para ello, basta:
    # apt-get install ruby1.9.1 gems1.9.1
    Con el único problema de que, en lugar de escribir “gems” me toca escribir “gems1.9.1”. Supongo que para hacerlo por defecto debería crearme links estáticos en /usr/bin.

    Por otro lado, dices “Arrancamos autotest para no tener que andar ejecutando rspec cada vez”. ¿Cómo lo arrancamos?

    Y para finalizar: un colega me pasó un script para ejecutar lo que sea cada vez que cambia cualquier archivo en un directorio o subdirectorio (usando ubuntu o debian). El script se encuentra en las arco-devel (http://crysol.org/es/arco-devel), y tras algunas modificaciones mías, reza así: http://goo.gl/veCQp

    ¿Qué ventajas ofrece autotest sobre mi pequeño script? Mi script tiene una ventaja: cualquier modificación en cualquier archivo provocará la ejecución de las pruebas, y esto es válido para cualquier lenguaje (en el ejemplo, python).

    Por lo demás… ¡buen artículo!

    • jmbeas

      Vaya, Miguel Angel, perdona por no contestar. Se me pasó. 🙁

      No he probado inotify (y menos si tiene ese bug tan molesto). Pero me lo apunto.

      Lo de rvm no es obligatorio. Lo que pasa es que quiero usar jruby también y, además, soy un poco obseso de tener control sobre el entorno. 🙂

      Autotest se arranca escribiendo “autotest” en la linea de comandos. Respecto a tu “autolaunch” diría que es exactamente lo mismo, salvo que “autospec” está más pensado para usar (en general) los convenios de Ruby, RSpec y Rails. 🙂

      ¡Gracias por los comentarios!

  • Pingback: Autotest con sonidos()