Entendiendo qué es BDD (Behavior-Driven Development) (IV). Probando e instalando Cucumber

¡Hola a todos de nuevo! Soy Natalia Carretero y aquí os presento el cuarto post de la saga de BDD que espero que os guste. Como te explicaba en el post anterior (te aconsejo que lo leas si no lo has hecho ya, aquí te dejo el link), Cucumber es la herramienta más popular para utilizar BDD (pero hay muchas más), por lo que en este post explicaré cómo instalar Cucumber dependiendo del sistema operativo que tengas y un ejemplo para que aprendas los elementos básicos que tiene Cucumber con Gherkin, en el lenguaje Ruby y con el sistema operativo Windows (pero es similar para Linux).

Instalación en Windows

Desde la página de Ruby http://rubyinstaller.org/downloads/, descarga e instala una versión de Ruby. En el proceso de instalación, marca la casilla “Add Ruby executables to your PATH.”
A continuación, descarga e instala “Ruby Development Kit” desde la misma página en la que descargues Ruby, con la versión que corresponda en relación a la versión de Ruby instalada. Ejecuta el .exe y guárdalo en una carpeta del sistema. Desde la consola de Windows posiciónate en esa capeta y ejecuta ruby dk.rb init para generar el fichero config.yml, después ejecuta ruby dk.rb install para instalarlo.
Una vez que tengas esto, ya puedes descargar la gem de Cucumber. Desde la línea de comandos ejecuta gem install cucumber y una vez instalado, cucumber –help para confirmar que se instaló correctamente.

Instalación en Linux o Mac

Necesitas tener instalado Ruby. Si haces las pruebas en el mac, no te va a servir el Ruby que viene por defecto, por ello actualiza la versión y utiliza el rvm, cambia el path y usa tu instalación de Ruby.
Vete a la consola y pon: $gem install cucumber
Aunque sea obvio decirlo, si te salta un “You don’t have write permissions” pon un “sudo” delante del gem (y mete el password de administrador, es decir $sudo gem install cucumber).
Hecho lo anterior, ejecuta ahora: $cucumber –help y comprueba que funciona.

Probando Cucumber con un ejemplo

Para hacer un ejemplo sencillito que ayude a entender Cucumber, vamos a implementar la multiplicación de una calculadora. Lo primero que haremos es crear un directorio con el nombre que quieras, y ahí guardaremos las características (es decir, los archivos .features) y el programa. En este caso lo vamos a llamar calculadora, y entramos en la carpeta. En la consola lo haríamos con mkdir calculadora y a continuación cd calculadora. Si en ese momento ejecutamos el comando cucumber, da fallo y dice que debemos crear un directorio llamado feature:
Ejecutar Cucumber sin nada
Esto es porque cuando ejecutamos cucumber sin argumentos, coge como directorio por defecto a uno llamado “features” y como no lo encuentra, Cucumber avisa. Para solucionarlo, creamos dentro de la carpeta calculadora, un directorio llamado features. Y si ejecutamos Cucumber otra vez, obtenemos la siguiente salida:
Ejecutar Cucumber solo con carpeta features
Esa salida indica que Cucumber ahora sí que encontró el directorio features, pero no encontró ningún escenario que pudiera ejecutar. Para crear una prueba, creamos un documento con la extensión .feature dentro del directorio features, con el nombre multiplicación.feature. La estructura de un fichero .feature básica es:
 
Característica: descripción de la prueba
Para lograr un beneficio
Como rol
Quiero realizar una funcionalidad
Escenario: descripción del caso de prueba
                        Dado un contexto inicial
                        Cuando ocurre un evento
                        Entonces asegurar que se obtiene
 
Analizando esta estructura podéis ver que una parte de ella tiene la forma de historia de usuario. Que Cucumber permita describir la historia de usuario junto con la prueba aporta un gran beneficio para los desarrolladores y ayudará a documentar el código.
En el fichero multiplicacion.feature escribimos:
Escenario del archivo multiplicacion.features
Cuando ejecutamos Cucumber, la salida que nos muestra es:
Ejecutar Cucumber con el .feature
Con esta salida, en primer lugar podemos ver que Cucumber ha buscado en la carpeta “features” los archivos con extensión .feature y los ha ejecutado, ya que muestra el contenido del archivo. Ahora, la salida 0 scenario  ha cambiado por 1 scenario (1 undefined). Esto quiere decir que Cucumber ha encontrado un escenario pero no sabe cómo debe ejecutarlo. También ha cambiado la salida 0 steps por 3 steps (3 undefined), porque ni el dado, ni el cuando, ni el entonces están definidos. Después de esto, Cucumber muestra una anotación, dando un ejemplo de la estructura que debemos utilizar para crear casos de prueba en Ruby. Para crear esos casos de prueba, primero creamos una carpeta llamada “step_definitions” dentro de la carpeta features que hemos creado anteriormente.
Para crear un caso de prueba, en esa carpeta creamos un archivo con extensión “.rb”, al que llamaremos calculadora_steps.rb. En el archivo, copiamos el ejemplo del caso de prueba que había mostrado en pantalla Cucumber anteriormente.
Definición del caso de prueba
Al ejecutar Cucumber el escenario ha cambiado de undefined a pending. Esto significa que Cucumber ha ejecutado el primer caso de prueba, pero como aún no está implementado, lo marca como pendiente. Además, Cucumber ha cambiado los 3 steps (3 undefined) a 3 steps (2 skipped, 1 pending). Para entender esto, hay que tener en cuenta que Cucumber cuando ejecuta un escenario, ejecuta los casos de prueba y si alguno de ellos da fallo interrumpe la ejecución y los siguientes los omite y se los salta.
Ejecutar Cucumber con las definiciones pendientes de hacer

  • Implementar un caso de prueba

Ahora implementaremos el primer caso de prueba que habíamos definido en el archivo features/step_definitions/calculadora_step.rb. Cucumber dice que debe tener esta apariencia:
Definición del primer caso de prueba
Podemos ver que dado, do y end son palabras clave que deben aparecer en todos los casos de prueba. Después del dado, aparecen unos paréntesis donde muestra algo parecido a lo que habíamos escrito en el escenario, solo que cambia el “5*5” por “(.*?)”. Después del do, indica los argumentos que recibe y que podemos utilizar en el caso de prueba, y a continuación pone pending para indicar que es ahí donde debemos definir el caso de prueba.
El dado representa la entrada, por lo que en primer lugar definiremos un argumento llamado “entrada”. En Ruby, un identificador que comienza con @ es una variable de instancia y asignamos un valor a la misma en tiempo de ejecución, por lo que donde ponía pending, por ahora lo sustituimos por:
Definición del primer caso de prueba implementado en Ruby
Y lo que ocurre si ejecutamos Cucumber es:
Pasa el primer caso de prueba
¡Ya hemos pasado el primer caso de prueba! Ya marca en verde el primer caso de prueba, que es la forma de indicar que lo hemos pasado.
Para implementar el siguiente caso de prueba, volvemos a editar el archivo features/step_definitions/calculadora_step.rb y ponemos:
Definición del segundo caso de prueba Lo que intentamos hace aquí es que evalúe la expresión 5*5 con la función eval de Ruby. Si ejecutamos Cucumber:
Ejecutar Cucumber y pasar los dos primeros
¡Ya pasamos el segundo caso de prueba también! ¡Ya solo queda uno más! Vamos a por él. Abrimos el archivo features/step_definitions/calculadora_step.rb para realizar el caso de prueba que queda y lo modificamos por:
Definición del tercer caso de prueba
Donde nos creamos una variable llamada salida_esperada de la misma forma que hicimos con la variable entrada y comparamos ese valor a la variable de instancia @salida.
Ejecutar Cucumber y pasar todos los casos de prueba Al ejecutar Cucumber ¡Ya pasa todos los casos de prueba y por lo tanto el escenario!
Y hasta aquí llegamos en este post, espero que os haya gustado y ¡que todo os salga tan verde como un buen cucumber o gherkin! 😉

jgarzas

Ph.D. en informática, Postdoctorado en la Carnegie Mellon (EE.UU) e Ingeniero en Informática.

Primera vez que me tocó hacer una gestión Ágil en una empresa... año 2001. Desde entonces he trabajado en, o para, más de 90. Y he formado a más de 2000 alumnos.

También soy profe de la Universidad Rey Juan Carlos.

0 comentarios en “Entendiendo qué es BDD (Behavior-Driven Development) (IV). Probando e instalando Cucumber”

  1. buenas
    ¿alguien ha seguido las instrucciones de instalación?
    el último paso me falla
    c:\Users\lenovox201\Downloads\RubyDevKit>ruby dk.rb init
    [INFO] found RubyInstaller v2.2.5 at C:/Ruby22
    Initialization complete! Please review and modify the auto-generated
    ‘config.yml’ file to ensure it contains the root directories to all
    of the installed Rubies you want enhanced by the DevKit.
    c:\Users\lenovox201\Downloads\RubyDevKit>ruby dk.rb install
    [INFO] Updating convenience notice gem override for ‘C:/Ruby22’
    [INFO] Installing ‘C:/Ruby22/lib/ruby/site_ruby/devkit.rb’
    c:\Users\lenovox201\Downloads\RubyDevKit>gem install cucumber
    ERROR: Could not find a valid gem ‘cucumber’ (>= 0), here is why:
    Unable to download data from https://rubygems.org/ – SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *