Sunteți pe pagina 1din 74

Automatizacin de pruebas

+

Caractersticas principales
del lenguaje

Lenguaje interpretado, no compilado.

Su sintaxis esta inspirada en Python y Perl con caractersticas de


programacin orientada a objetos similares a Smalltalk

Existen distintas versiones !.", !.#, $.%

Puramente orientado a objetos.

Es un lenguaje de programacin multiparadigma, permite

Programacin procedural &e'iniendo 'unciones y variables


'uera de las clases siendo parte del objeto rai( )bject.

Programacin orientada a objetos * +odo es un objeto ,

-uncional

Soporta re'lexin *capacidad de cambiar su estructura de


alto nivel en tiempo de ejecucin,.

Soporta metaprogramacin.

Gemas (gems)

Las libreras en .uby se llaman gemas *gems, y son versionadas.


Las gemas p/blicas se alojan en .ubygems.org aun0ue puede
tenerse un gemserver para alojar gemas propias como en nuestro
caso 0ue tenemos gems.despegar.com
Se instalan en el sistema mediante el comando
Las gemas instaladas se pueden ver listadas mediante el
comando
Para agregar una gema a un programa *1.rb, se utili(a la instruccin

Gemas (gems)
Las gemas junto a sus versiones se pueden administrar
mediante .23 y 4undler

.23 *.uby 2ersion 3anager, 5dministra las versiones


de .uby y tambi6n el conjunto de gemas instaladas a
utili(ar en un proyecto


Gemas (gems)

En resumen los comandos b7sicos para .23


seran

rvm list

rvm use <version_de_ruby>

rvm gemset create <nombre_del_gemset>

rvm gemset list

rvm gemset use <nombre_gel_gemset>

rvm rvmrc create

rvm help

Gemas (gems)

Bundler 4undler permite manejar las gemas, sus versiones y sus


dependencias de manera controlada. Para eso debe existir un archivo
llamado 8em'ile en el 0ue se especi'ican las gemas y versiones del
proyecto.

Para instalar las gemas de'inidas en 8em'ile se usa el comando



IRB
Ruby provee una consola interactiva para poder
ejecutar comandos Ruby en tiempo real.
Esto permite desarrollar scripts de automatizacin en
tiempo real con el browser o frenar la ejecucin e
interactuar en un punto determinado del programa.

Lenguaje dinmico
Las variables en ruby no son tipadas. Una
variable que es un string puede pasar a
contener un nmero entero o cualquier otro
tipo de dato
foo ! "bar#
foo ! $
foo ! $.%
foo ! &'uno'( )( tres( "cuatro#*

Ambitos de variables

+lobales

,omienzan con el s-mbolo . /.var0

1e acceden desde cualquier punto del program

2e ,lase

,omienzan con dos s-mbolos arroba /33var0

2e instancia

,omienza con un s-mbolo arroba /3var0

Locales

,omienzan con una letra minscula o guin


bajo/var o 4var0

Tipos de datos en Rub

5um6ricos

1trings

7rreglos

8as9es

1ymbols

2ate:;ime

!trings

1e representan a trav6s de comillas simples o dobles


>'un string con comillas simples'
>un string con comillas dobles

Las comillas dobles permiten interpolacin y ejecucin de caracteres de


control de flujo de te<to
>dia=2
>ao=2013
>mensaje=hoy es #dia! de "gosto#ndel ao #ao!
>puts mensaje
hoy es 2 de "gosto
del ao 2013
=> nil

!trings

2os strings pueden ser concatenados con el signo =


>a=hola
>b=mundo
>c = a $ $ b

Los caracteres de un string pueden accederse a trav6s de su -ndice


>a=un string
>"%3&
=> s

!trings
>ara conocer los m6todos que posee el tipo de
dato string se puede invocar al m6todo met9ods
>'tring(methods

Los m6todos de strings comunmente utilizados en


automatizacin son
(include) * (do+ncase * (gsub * (length *
(scan *(split * (to,i * (replace * (count

;oda la documentacin se encuentra en


http://www.ruby-doc.org/core-1.9.3/String.html

Arreglos (Arras)
7 diferencia de otros lenguajes( en Ruby los arreglos son de
objetos y no de un tipo de dato.

Los elementos de un array se anotan entre corc9etes


separados por comas
my,array = %uno- 2- .tres- 'cuatro' &

Un arreglo vac-o se inicializa de las formas


my,array = "rray(ne+
my,array = %&

Arreglos (Arras)

>ara agregar elementos a un arreglo


my,array // 0nue1o elemento0
my,array(push2otro mas3

>ara acceder a los elementos de un array se utilizan los -ndices


4oo=%0bar10-0bar20-0bar30-0bar50-0bar60&
4oo%2& => 0bar30

? bien un rango de -ndices


4oo%1((3& => %0bar20- 0bar30- 0bar50&

Arreglos (Arras)

>ara conocer los m6todos que posee el tipo de dato 7rray


se puede invocar al m6todo .met9ods al objeto 7rray
>"rray(methods

Los m6todos de arreglos comunmente utilizados en


automatizacin son
(count * (each * (each,+ith,inde7 * (4irst *
(last * (sort * // * (4latten * (include) *
(length * (map * (select * (push * (pop

;oda la documentacin se encuentra en


http://www.ruby-doc.org/core-1.9.3/Array.html

Hashes
Los 9as9es son colecciones de elementos de tipo @eyvalue.
7 menudo se les llama diccionarios.

Control de lu!o
"oops y condicionales
Ruby provee m6todos sencillos para el control
de flujo de un programa ya sea para bucles o
loops o para condicionales en dnde deba
evaluarse una e<presin /w9ile0

7lgunos m6todos de iteracion fija son

times

upto

downto
Estos tres m6todos tienen una sinta<is muy similar. En todos se
puede obtener el nmero de interacin
"oops

#hile y sus $ariantes

%ntil y sus $ariantes

%ntil y sus $ariantes

&e't( brea) y redo
Ruby provee instrucciones para alterar la
ejecucin de un bucle.

ne't >asa a la siguiente iteracin.

brea) ,orta la ejecucin y sale del loop

redo Auelve a ejecutar el bloque en el que se encuentre la


instruccin redo sin aumentar el valor de iteracin en s-.

*( else y elsi
En Ruby la instruccin condicional if y sus
derivados se escriben de la forma

Case +switch,
,omo argumentos para las clBusulas w9en pueden coe<istir
distintos tipos de datos
+hen 'uno'-1-true

-.todos
Los m6todos comienzan con la palabra
reservada def y finalizan con la palabra end.
>or convencin se escriben completamente
en minsculas y sin espacios

Clases - /b!etos
Una clase se define a trav6s de la palabra reservada class y su nombre no
puede contener espacios y debe comenzar con una letra mayscula
5otar las variables de instancia que comienzan con 3.
En el m6todo initialize se recibe un 9as9 como parBmetro.
El m6todo nombre0 define sintBcticamente su significado con el simbolo ! al final de su
nombre.
Ruby permite sobrecarga de m6todos. >or ejempllo( se puede redefinir el significado del
m6todo 00( el del m6todo .split( etc.

Clases - /b!etos
-.todos de clases

>ara acceder al m6todo de una clase a trav6s de un objeto se


utiliza el . /punto0 seguido del nombre del m6todo. >ara el
ejemplo anterior ser-a
Lo que darB el resultado
Nombre: Matz
Dni: 20656788
Sexo: masculino

Clases - /b!etos
1etters2 Setters2
0
0
Cmplementacin
attr_accessor
+enera los m6todos de
attr_reader y attr_writer
simultBneamente.

-3dulos
Los mdulos se definen mediante la
palabra reservada module y su nombre
debe comenzar con letra mayscula al
igual que las clases.
Los usos principales son como
5amespaces y los llamados mi<ins.
Los 5amespaces definen un conte<to al
que pertenece un m6todo. >or ejemplo(
con los mdulos no 9abrB problema si
e<isten dos m6todos con el mismo
nombre si cada uno pertenece a un
mdulo diferente.
Los mi<ins permiten incluir los m6todos de
un mdulo como parte de los m6todos de
una clase.
Los mdulos se incluyen a trav6s de la
instruccin re4uire o re4uire5relati$e si
se encuentra en el mismo directorio..

-3dulos
&A-6S7AC6S
despegar.rb
main.rb
require4relative porque se encuentra en el mismo
directorio.
'despegar' corresponde al nombre del arc9ivo y no del
mdulo aunque siempre tienen el mismo nombre.
1ituado en el directorio( al ingresar
ruby main.rr en la terminal se obtiene
como resultado

-3dulos
-*8*&S
messages.rb
main.rb
1ituado en el directorio( al ingresar
ruby main.rb en la terminal se obtiene
como resultado
Los mdulos se pueden incluir dentro de una
clase y sus m6todos pasan a formar parte de
dic9a clase.
1e utiliza la clBusula include NombreModulo

Henry 9uby -anager
8enry Ruby Danager es una gema que provee instrucciones
tiles para manejar los tests adaptados a los requerimientos
necesarios para ser ejecutados en 8enry
8 gem install henry*ruby*manager
Uso
henry*ruby*manager create /nombre del proyecto>
%**4rame+or9=:;"<=>?;@&%**dri1er=A;BC=;&%*p&

?pciones

EEframewor@!FR7DEG?RH Los valores posibles son ,ucumber( Rspec(


Dinitest( Ra@e( 2efault.

EEdriver!2RCAER Cndica el tipo de driver a utilizar. Las opciones vBlidas


son Gatir( 1elenium( ,apybara. 1i no se especifica ningn valor se toma
1elenium por defecto.

Ep Cndica que se utilizarB un modelo >age ?bject



,reacin de un proyecto ,ucumber
hrm create mi,proyecto D4rame+or9=cucumber D
dri1er=selenium
Henry 9uby -anager

>uesta a punto del proyecto
Luego de la creacin del proyecto es necesario instalar las
gemas definidas en el +emfile. ,omo 8RD lo indica
9acemos
8 cd mi,proyecto
8 bundle install
Henry 9uby -anager

Ejecutando el proyecto de ejemplo
>ara ejecutar el proyecto de ejemplo ? ,U7LIUCER >R?JE,;?
de la forma en que lo ejecuta 8enry se utiliza el comando
:mi4proyecto. henry*ruby*container
2e 6sta manera se estB ejecutando localmente del mismo modo en que lo 9ar-a
8enry. >or ejemplo( tomando datos desde un arc9ivo llamado in.9enry
Henry 9uby -anager


6structura de archi$os
en Cucumber
;odo lo que necesita ,ucumber se encuentra en la carpeta features
features: Toda la estructura de Cucumber est dentro de !sta car"eta# Como
arc$i%os contiene los que definen los tests escritos en te<to plano &'#feature(
step_definitions: ,ontiene los arc9ivos con la definicin de los pasos en s-.
1on arc9ivos Ruby /K.rb0 y basicamente son los que tienen el cdigo que
interacta con el navegador y el objeto de prueba.
support: 2entro de 6sta carpeta se alojan todos los arc9ivos Ruby agregados
que contienen clases( funciones( modulos( m6todos( etc. Es decir( todo el cdigo
e<tra que ayuda a los steps4definitions. >or ej. ,ontiene la carpeta pages que
es la que contiene las clases page object del proyecto.
env.rb: Este arc9ivo es el primero en ejecutarse cuando se lanza la ejecucin
de cucumber. >or lo general aqu- se suelen especificar los require de las gemas(
la definicin de los mdulos o clases que formarBn parte del mundo ,ucumber(
la carga de las paginas >age ?bject( etc.
hooks: Este arc9ivo contiene los llamaods 9oo@s que son puntos clave de la
ejecucin de cucumber. >or ejemplo( antes de cada test( despues de cada test(
despues de cada step( al finalizar la ejecucin general( etc.

Archi$os .eature
Un arc9ivo de te<to plano con e'tensi3n .eature.

Utilizan el lenguaje 1her)in /9ttps::git9ub.com:cucumber:cucumber:wi@i:+9er@in0

7l ser de te<to plano lo puede leer( entender y colaborar cual4uier in$olucrado en el


proyecto as- tenga un perfil t6cnino o no ;esters( 2evs( Funcionales( >?.

1u nombre no puede contener espacios y por convencin va todo en minusculas

El espacio se reemplaza por guin bajo /e)#: lo*in+%alidations#feature0

,ontiene uno o mas tests llamados escenarios

>uede tener una precondicin que se aplica a todos los tests llamada :ac)ground o
Antecedentes

>ermite manejar tablas de datos de modo que se arme una matriz de entrada para un
mismo test. Esto e$ita la reescritura de un test. 1e ejecuta tantas veces como filas
tiene la tabla.

2urante la ejecucin los pasos se $an mostrando en consola. Esto evita tener que
desarrollar manualmente un sistema de traza de los pasos dentro de los tests.

Admite el eti4uetado +;tag, de tests /scenarios0 para ejecutarlos parcialmente( en


conjuntos( por criterios( y mediante operacines lgicas de etiquetas.

7dmite escribir los tests en +9er@in para distintos idiomas. El idioma por defecto es el
ingl6s.

6!emplo de un archi$o eature
Utiliza palabras
clave como

,aracter-stica

7ntecedentes

Escenario

Esquema del
escenario

2ado

,uando

Entonces

Ejemplos

6!emplo de un archi$o eature
Signiicado de las palabras cla$e

,aracter-stica /Feature0 2efine el alcance de los tests.

7ntecedentes 2efine precondiciones que se ejecutarBn antes de cada escenario. En el


se definen los pasos previos a cada test.

Escenario /1cenario0 1on los tests en si. ,ada escenario es un test. En el se definen los
pasos

Esquema del escenario /1cenario ?utline0 Es lo mismo que los escenarios pero con la
posibilidad de definir Ejemplos /tablas0. Este tipo de escenario se ejecuta integramente
para cada fila de la tabla.

2ado /+iven0 Funcionalmente no tiene ningun efecto( solo sirve para darle legibilidad al
test y se utilizan para los pasos que llevan al objeto de prueba a un estado previo a la
accin principal a evaluar.

,uando /G9en0 7l igual que '+iven' no tiene efecto alguno. 1u objetivo es referenciar los
pasos que ejecutan la accin central que desencadenar-a el estado a evaluar como
resultado.

Entonces/;9en0 ;ampoco tiene efecto. Referencia los pasos que indican el resultado
esperado.

J 1e utiliza para la concatenacin de pasos del mismo tipo.

Ejemplos 1on tablas que definen valores que serLn referenciados mediante la cabezera
de la tabla en los pasos entre los s-mbolos mayor y menor M9eaderN

6!emplo de un archi$o eature
2efine la caracter-stica a probar.
>or lo general se define de la forma
"2ada cierta condicin o estado
,omo < tipo de usuario
Iuiero verificar:validar tal caracter-stica#
2efine las precondiciones. 2entro contiene los
pasos necesarios para llevar el estado de la
aplicacin al requerido para ejecutar los tests.
2efine el test en si. ,ompuesto de un t-tulo
descriptivo del mismo y luego todos los pasos.
Los pasos comienzan con palabras claves
que le dan legibilidad a las acciones.
El sentido de las palabras claves ser-a algo
como
Dado: >recondiciones o acciones iniciales.
Cuando: 7ccin que generar-a un resultado.
+enera un cambio de estado.
Entonces: Evaluacin de los resultados
Y: 1implemente para concatenar dos pasos
del tipo de los anteriores
Dediante la palabra clave Ejemplos 2efine una
tabla con distintos valores. ,ada l-nea de la tabla
lanza una ejecucin del test.

9elaci3n entre eatures and
steps5deinitions
eature5e'ample.eature
steps5e'ample.rb
Las definiciones de pasos /1teps definitions0 estan dadas por e<presiones regulares
/<* am on main page=/ 7 trav6s de esas ER se vinculan los pasos del feature file con
La definicin de los mismos en steps definitions.

Steps >einitions
7rgumentos
,i%en * login with 'username' and '$)OPQR'
Feature file
1tep def file
,i%en /<* login with '/.=0' and '/.=0'.: do Suser(passS
end
T 7qui va el cdigo Ruby que opera
T con los valores de user y "ass
En e<presiones regulares el punto significa cualquier caracter y el simbolo
= es un cuantificador del simbolo que lo precede que indica una o mas
veces.
>or lo tanto /.=0 equivale a ",ualquier caracter una o mas veces#.

Steps >einitions
E<presiones regulares
>ara practicar y:o probar e<presiones regulares
9ubular.com
/.0 Un caracter cualquiera.
/.=0 ,ualquier caracter una o mas veces.
/.K0 ,ualquier caracter cero o mas veces.
/Ud0 ,ualquier d-gito.
/Ud=0 ,ualquier d-gito una o mas veces.
/UdK0 ,ualquier d-gito cero o mas veces.
/Uw0 ,ualquier caracter alfanum6rico.
/UG0 ,ualquier caracter no alfanum6rico.
/Us0 ,ualquier espacio en blanco.
/U10 ,ualquier caracter que no sea un espacio en blanco.
=info en
9ttp::cu@es.info:stepEdefinitions.9tml

Steps >einitions
Una forma de escribir los steps definitions es
$ V +enerar el arc9ivo features con los pasos que debe realizar el test.
) V Ejecutar los test
,ucumber mostrarB en color amarillo que e<isten pasos sin definir y ademBs sugiere como
escribirlos.
1olo resta cambiar los valores entre comillas por +.?, para 9acerlos gen6ricos y
poder reutilizar los pasos con diferentes datos de entrada. 7demBs( deben pasarse
como argumentos entre pipes luego del do @arg1(argA@

Steps >einitions
;7WL71
Una forma es usando tablas en escenarios simples donde
se especifican datos en forma de tabla
El ltimo parBmetro que se
especifica en el step
corresponde a la tabla que
sigue a dic9o step
;able es un array de arrays.
Los valores de una fila
conforman los elementos de
un array que a su vez( cada
array conforma los
elementos del array principal

Steps >einitions
;7WL71
La otra forma es en esquema del escenario donde se 9ace referencia a
una columna de la tabla y para cada fila se irB ejecutando el escenario
El valor correspondiente a la fila en ejecucin
En este caso la tabla no
se pasa como argumento
al step sino el valor entre
B y C correspondiente a
la columna que
representa y a la fila en
ejecucin.
1i una ejecucin de los
test( una fila de la tabla(
fallara( la salida serB la
linea en color rojo.

Cucumber
=
Selenium #ebdri$er

Iue vamos a 9acerX

,rear un nuevo proyecto

Eliminar los arc9ivos de ejemplo

,rear un feature file

Ejecutar

2efinir el primer step /step4definitions0

Ejecutar

Cmplementar

Ejecutar

Finalizacin de definicin de los pasos

Ejecutar

2ebugging

Refactorizacin:reusabilidad

N ,rear un nuevo proyecto
>ara crear el proyecto utilizamos la gema 8enry Ruby Danager
hrm create mi,proyecto **4rame+or9=cucumber **dri1er=selenium
>ara ver el modo de uso de
-enr. /ub. Mana*er
se puede escribir
. 9enryErubyEmanager E9
. 9enryErubyEmanager
o . 9rm

N Eliminar los arc9ivos de ejemplo
7ntes de crear nuestros tests vamos a eliminar los arc9ivos que
vienen de ejemplo para tener nuestro proyecto mas limpio
8 cd mi,proyecto
mi,proyecto8 cd 4eatures
mi,proyectoE4eatures8 rm 4eature,template(4eature
mi,proyectoE4eatures8 cd step,de4initions
mi,proyectoE4eaturesEstep,de4initions8 rm steps,e7ample(rb

N ,rear un feature file
,on un editor de te<to creamos un nuevo arc9ivo dentro de la
carpeta :features y lo guardamos como bus4ueda.eature
Luego en el arc9ivo ponemos
'

N ,rear un feature file N >arametrizacin
Usando Henry( podemos 9acer que los datos de entrada est6n
parametrizados y poder ejecutar un mismo test para mBs de un
juego de valores de entrada. >or lo tanto( parametrizamos los
argumentos de los steps de la siguiente manera
'
7tencin Esta es solo una manera de utilizar los parBmetros
desde in#$enr.( la nomenclatura a utilizar estB dada por el
desarrollador de automatizacin.

N Ejecutar
En la terminal escribir el comando henry*ruby*container
El resultado indica que 9ay un
escenario no definido y siete pasos no
definidos.
El color amarillo es el indicado para
cuando no se encuentra la definicin de
los pasos.
;ambi6n sugiere su implementacin.
1eleccionamos todos los pasos con el
mouse y los copiamos 9aciendo
Ctrl0S$ift0C
Colores de salida en consola
Undefined /sin definir 0
1@ipped /1alteado0
>assed />asado E ?H 0
Failed / Fallido 0

N 2efinir los steps /step4definitions0
2entro de la carpeta 1ste"+definitions creamos un nuevo arc9ivo y lo guardamos como
bus4ueda5$uelo.rb
a0 >egamos los pasos que tenemos en el portapapeles que copiamos en el paso anterior
b0 Los parametrizamos cambiando lo que se encuentra entre comillas simples por +.?,
c0 J agregamos la recepcin del parametro luego del do en cada paso para poder operar
con los valores dentro de los steps.
Utilizamos el primer paso de
ejemplo.
Los pasos b0 y c0 deben
aplicarse a todos los pasos.
Das adelante los
implementaremos.
"os par.ntesis pueden
omitirse.

N Ejecutar
Una vez definidos los pasos volvemos a ejecutar con el comando 9enryErubyEcontainer y
notaremos que las cosas van cambiando de color.
2entro de los steps aparece una instruccin de ,ucumber que se interpreta como
pendiente. Esto es til en W22 /We9avior 2riven 2evelopment0 ya que inicialmente se
definen los requerimientos de la aplicacin a desarrollar( se definen tests y a medida que
se van implementando se van definiendo los pasos. Esto da una idea de la madurez del
proyecto.
7l encontrar un paso pendiente
o con implementacion sin
definir( es decir
";?2? /,ucumber>ending0#(
automBticamente saltea los
pasos siguientes ya que no
puede continuar con la
secuencia.

N Cmplementar
9oo@s.rb
>ara interactuar con la 7>C de 1elenium( quien realiza acciones sobre el 2river
Firefo<( usaremos la variable ;browser.
3browser es inicializada en el ar9ivo $oo2s#rb. Este arc9ivo contiene las acciones a
realizar en momentos clave de la ejecucin de cucumber.
:eore do ;odas las instrucciones contenidas dentro de 6ste bloque se ejecutarBn
antes de comenzar cada escenario. En este caso se inicializa una nueva instancia de
3browser.
Ater do: 1imilar a 3efore do pero para ejecutar instrucciones posteriores a la
ejecucin de un escenario.
=info sobre 8oo@s
9ttps::git9ub.com:cucumber:
cucumber:wi@i:8oo@s

N Cmplementar
8enry nos permite parametrizar los datos de entrada de un test a trav6s del arc9ivo
Y1?5 llamado in.henry.
La inicializacin de los datos provistos por in#$enr. se realiza en el arc9ivo env.rb
contenido dentro de la carpeta 1su""ort#
Los datos se cargan en la variable global =7A9A-S
en$.rb es el primer ar9ivo en ejecutarse cuando se lanza a correr cucumber( es por
eso que en 6ste se suele especificar casi todas las gemas a utilizar en el proyecto.

N Cmplementar
79ora si( volviendo al arc9ivo de bus4ueda+%uelos#rb definimos las acciones a
realizar para cada paso
El parBmetro url es modificado con un valor de =7A9A-S si el parametro que
proviene del feature contiene:incluye el string "in.#.
url.split+D.D,.last indica partir el valor de url por el caracter punto '.' / url#s"lit&5#5(
devuelve un array&"in#(#base4url#*0 luego con el m6todo last tomar el ltimo( por lo
tanto tomarB base+url. En definitiva( url terminarB teniendo el valor
=7A9A-SEDbase5urlDF
2e la variable ;browser( que es la que se comunica con el browser en s-( utilizamos
el m6todo .get pasando como argumento la url que a su vez es provista por in#$enr.
Esto darB como resultado que el browser navegue 9acia la direccin provista por
"TZurl[#.

N Cmplementar N Una nueva ejecucin
5uevamente ejecutamos henry-ruby-container y vemos que sucede
79ora el primer step aparece verde /$ passed0 y es porque toma el valor de base4url
del arc9ivo in.9enry pero la url no es la que necesitamos( queremos ir a
despegar.com.ar en lugar de despegar.com.
En el arc9ivo $oo2s#rb se puede comentar la l-nea que se encuentra dentro del bloque
6fter do para evitar que se cierre el navegador al finalizar el test y poder ver en que
estado qued cuando fall.
7fter do
T 3browser.close
end

N Cmplementar N in.9enry
Este es el in.9enry del ejemplo
Worramos los parametros que no usaremos(
modificamos el valor de base4url y agregamos
los que vamos a necesitar
Aemos que todos nuestros parBmetros estBn
dentro de ";area\$#.
;area\$ / que podr-a tener cualquier nombre0
es un identificador de tarea que utiliza 8enry
para la ejecucin.

N Cmplementar N in.9enry ] 9enryEconte<t.yml
Las tareas definidas en 9enryE
conte<t.yml serBn las que se ejecutarBn
9enryEconte<t.yml
>or lo tanto( en la ejecucin de ;area\$( 1?L? estarBn disponibles los parBmetros definidos
dentro de ";area\$# del in.9enry
7rriba de todo del in.9enry figura "all#( todos los parBmetros definidos aqu- dentro estarBn
disponibles para absolutamente todas las tareas.
Garea 4ue no se especiica en henry-conte't.yml( tarea 4ue no se e!ecuta.
7unque e<iste un arc9ivo llamado hints.henry que oficia de HiltroI de tareas a ejecutar
partiendo del total definido en 9enryEconte<t
in.9enry

N Ejecutar
Aolviendo a ejecutar el test mediante el comando 9enryErubyEcontainer obtenemos
El resultado en la consola es el mismo que el anterior( pero si miramos en dnde queda
el browser notaremos que estB tomando correctamente el parBmetro base+url de
in#$enr.. Es decir( queda en el sitio de despegar.com.ar /7rgentina0 en lugar de la pBgina
donde se elije el pa-s de residencia.

N Finalizacin de la definicin de los pasos
En un principio agregamos a todos los pasos restantes la conversin de los argumentos
a e<presin regular /.=0 y la recepcin de los mismos al final de cada paso en aquellos que
sea necesario. Los pasos quedar-an de la siguiente manera
1i ejecutamos 6stos
cambios( el resultado
serB

N Finalizacin de la definicin de los pasos
?btenemos las referencias a los distintos elementos en un navegador( situados en la
pBgina que estaremos probando. >ara eso utilizamos el inspector de elemento que
viene por defecto en el navegador /opcin del menu conte<tual del navegador V clic@
derec9o0
,lic@ derec9o N Cnspect Element
Utilizaremos el comando
ind5element de selenium
buscBndo por el atributo
lin)5te't.
El elemento resultante lo
guardamos en section+lin2 y
luego le ejecutamos el m6todo
clic@
,lic@ en
un lin@
Auelos

N Finalizacin de la definicin de los pasos
5uevamente utilizaremos el
comando ind5element de
selenium buscBndo por el
atributo id.
El elemento resultante lo
guardamos en text+field y
luego ejecutamos el
m6todo send+2e.s
pasBndole como argumento
el te<to a ingresar( en
nuestro caso el valor
proveniente de in.9enry
/Dadrid0
Finalmente buscamos el
lin@ que se forma en la
bsqueda /7Y7^0 para
9acerle clic@
,lic@ derec9o N Cnspect Element
Cngresar
un te<to
1iempre lo mas conveniente para ubicar un
elemento es utilizar el atributo id. 7unque no
siempre estB disponible.
En su defecto es conveniente utilizar su css.

N Finalizacin de la definicin de los pasos
$\:\_:)\$O
$`:\_:)\$O
\

N Finalizacin de la definicin de los pasos
En este caso utilizamos un case para
determinar a que botn queremos
9acer clic@. Esto es til cuando se
tienen muc9os botones y deseamos
utilizar un solo step.
En este caso( si se desea 9acer clic@
en buscar( se 9ace un find4element
mediante el nombre de la clase y
luego se aplica el m6todo clic@ a
dic9o elemento.
;ener en cuenta que un step definido de 6sta
manera funcionarB solo en la seccin vuelos para el
botn Wuscar a menos que las demBs secciones
/8oteles( ,ruceros( etc0 tengan un botn Wuscar
definido de la misma manera( es decir( con una
clase llamada ctnEsearc9button.
,lic@ en un
botn
/que no es un botn0

N Finalizacin de la definicin de los pasos
Dediante 7bro8ser#find+element
Wuscamos la etiqueta body y le
aplicamos el m6todo #text que
devuelve todo el te<to que
contiene dic9a etiqueta.
En definitiva( lo que 9acemos es
obtener todo el te<to de la pBgina.
Aerificamos si el te<to de la pBgina contiene el te<to
que especificamos en in.9enry /te<t0 y guardamos el
resultado en una variable result. Los valores
posibles son true o false.
result.should e4+true,( H&o se encontro...I
D6todo provisto por rspec
1i no se cumple la condicin de que result deber-a ser igual
a true( se lanza una e<cepcin que muestra el test fallido y
como salida se obtiene el te<to "5o se encontr....#
sleep+segundos,
Este m6todo detiene
la ejecucin la
cantidad de
segundos pasada
como argumento.
En nuestro caso lo
utilizamos para
esperar a que la
pBgina devuelva
resultados en la
bsqueda

N Ejecutar
Aolviendo a ejecutar con 9enryErubyEcontainer obtendremos

N 2ebugging
+racias a que Ruby es un lenguaje dinBmico y no compilado( el cdigo se va interpretando a
medida que se va ejecutando. Es por eso que se puede pausar la ejecucin de un script en
cualquier punto de la ejecucin.
>ara 6sto usaremos la gema debugger de la siguiente manera
E Escribiremos en la terminal 8 gem install debugger
E En el arc9ivo en%#rb agregamos la linea re4uire DdebuggerD luego de los requires e<istentes
E Finalmente( en el punto que se desee frenar la ejecucin agregamos simplemente debugger
Luego en la ejecucin( cuando se alcance 6sta
nueva instruccin( la consola se mostrarB
como la figura siguiente
7qui la ejecucin se frena y
muestra el conte<to en el
que 9a sido llamada la
instruccin debugger.
En este punto se puede
escribit 9elp para obtener
7yuda sobre debugger

N 2ebugging
7qu- es donde entra en juego la ventaja de Ruby sobre otros lenguajes compilados con la
posibilidad de ingresar a la consola e interactuar directamente con nuestra variable 3browser
y con las demBs variables del conte<to en tiempo de ejecucin.
Escribiendo simplemete irb se ingresa a la s9ell de Ruby
Luego se puede evaluar el contendio de text9 interactuar con 3browser y evaluar si las
instrucciones utilizadas en nuestros scripts son las adecuadas y operan de la manera correcta
para cumplir el objetivo planteado
irb lanza la s9ell de Ruby
9elp nos abre la ayuda de
2ebugger donde se listan los
comandos disponibles
Escribimos las variables disponibles
para ver sus contenidos
irb
,trl=c para salir de irb a Iueda en debugger /rdb0
, para continuar con la ejecucin de cucumber o ,trl=c nuevamente para terminar todo.

N Refactorizacin : Reusabilidad
8emos visto en nuestro cdigo a lo largo de su implementacin ciertas instrucciones
que se 9an repetido en reiteradas ocasiones. ;al es el caso de
variable !"#$#M%&step_ar'ument.split().)*.last+ if step_ar'ument.include, )in.)
>odemos 9acer un m6todo gen6rico donde le pasamos solo el valor que cambia en todos
los steps que ser-a ste"+ar*ument quedBndonos un m6todo como el siguiente dentro de
un arc9ivo llamado helpers.rb en la carpeta 1su""ort
9elpers.rb
En el arc9ivo env.rb inclu-mos 6ste nuevo arc9ivo
de la forma
env.rv
Luego en los steps utilizaremos el nuevo m6todo de la siguiente manera

S-ar putea să vă placă și