Documente Academic
Documente Profesional
Documente Cultură
+
Caractersticas principales
del lenguaje
-uncional
Soporta metaprogramacin.
Gemas (gems)
Gemas (gems)
rvm list
rvm help
Gemas (gems)
+lobales
2e ,lase
2e instancia
Locales
5um6ricos
1trings
7rreglos
8as9es
1ymbols
2ate:;ime
!trings
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.
?pciones
>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.
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
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.
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
Ejecutar
Ejecutar
Cmplementar
Ejecutar
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