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
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 @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!!
Veo que al final no usaste (¿leíste?) mi post.
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.
Efectivamente, un plagio en toda la regla.

Espero que no se note mucho…
De todos modos, anoche estuve viendo cómo personalizar un poco y, aunque hice algún avance, prácticamente volvería a plagiar otro artículo; en este caso: http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/
¿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!
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