jueves, 15 de septiembre de 2011

Reutilizar profile con Firefox webdriver de Selenium

¿Es posible reutilizar un profile en las pruebas de Selenium con FireFox webdriver?

Por lo que leo en stackoverflow, de momento no es posible. Se creará una instancia de navegador nueva cada vez con un profile nuevo. Si bien podemos indicar que ese nuevo profile se base en uno existente. Ésto no sé que utilidad tiene, porque no consigo reproducir los aspectos que me gustaría del perfil en el que me baso. Con el driver de Chrome sí he conseguido reutilizar completamente un profile.

miércoles, 17 de agosto de 2011

Buen recurso sobre pruebas automáticas en ruso

automated-testing.info

Xpath en Selenium WebDriver API

XPath en WebDriver

No he probado todavía si es cierto, como dice un comentario de esa página, que el HtmlUnitDriver es case insensitive como el FirefoxDriver.

Selenium Webdriver backed Junit4 test

Caso: Queremos exportar un test case creado con Selenium IDE a código Java, que se pueda ejecutar como un test de JUnit 4. Y además queremos utilizar el Webdriver emulando el Selenium RC, aprovechándo las ventajas de éste:


- Mayor número de navegadores soportados.
- Mejor traducción y soporte de los comandos traducidos desde Selenium IDE.


Por defecto al exportar se nos crea una clase que extiende SeleneseTestCase, siendo ésta deprecated (depreciada).


Debemos cambiar ésta clase por SeleneseTestBase.

viernes, 15 de abril de 2011

JMETER - asignar a una variable el resultado de una operación matemática sobre otra variable

Si quiero que el valor de una variable en Jmeter (asignación en la interfaz gráfica del Jmeter, dentro de un elemento de configuración, como "User defined variables" o un elemento de pre-procesamiento como "User parameters") sea el resultado de una operación matemática sobre el contenido de otra variable de jmeter, puedo usar la función "__jexl", por ejemplo de la siguiente manera, para asignar a MI_VARIABLE el resultado de multiplicar por dos el contenido de la variable OTRA_VARIABLE_JMETER:
MI_VARIABLE --> ${__jexl(${OTRA_VARIABLE_JMETER}*2)}

Si OTRA_VARIABLE_JMETER no contuviera un valor numérico, por ejemplo su valor fuese "s", entonces el resultado de la operación anterior sería 0 (cero).

jueves, 14 de abril de 2011

Como probar un script BeanShell en un fichero desde consola

En JMETER tenemos la posibilidad de ejecutar scripts BeanShell localizados en ficheros externos.

Por ejemplo, en la asignación de una variable de usuario en un módulo de pre-procesamiento, puedo querer asignarle el resultado de un script BeanShell localizado en un fichero "fichero.bsh".

Para probarlos desde la consola de comandos podemos ejecutar el siguiente comando:
java -cp rutaBaseDeLaInstalacionDeJmeter/lib/bsh-2.0b5.jar bsh.Interpreter ficheroScriptBeanShell.bsh

Creo que si se tiene instalado el intérprete bsh, también podemos ejecutar directamente:
bsh ficheroScriptBeanShell.bsh

Referencia desde Jmeter


¡Importante!: La ruta relativa del fichero con el script, debe ser relativa al directorio del script que ha invocado jmeter. Si he ejecutado directamente dirJmeter/bin/jmeter.bsh o dirJmeter/bin/jmeter.bat, entonces la ruta deberá ser relativa a dirJmeter/bin/. Y si he invocado el script rutaMiScript/miScript.sh que a su vez internamente ha llamado al dirJmeter/bin/jmeter.sh, entonces la ruta del fichero con el script BeanShell que ponga dentro de Jmeter tendrá que ser relativa a rutaMiScript/.

En caso de que queramos asignarle a la variable el resultado de ejecutar todo el fichero con el script BeanShell tendríamos, dentro de JMeter, la asignación siguiente:
MI_VARIABLE --> ${__BeanShell(source("rutaFichero/ficheroScriptBeanShell.bsh");)}

También podemos, en vez de ejecutar todo el fichero, invocar un método concreto. Para ello, primero incluimos el script con la misma invocación que en el caso anterior y luego a continuación invocamos el método-

¡Importante! La llamada al método del script de BeanShell debe tener escapadas las comas.
MI_VARIABLE --> ${__BeanShell(source("../wsPlans/ficheroScriptBeanShell.bsh");miMetodo("parametroTextoA"\,"parametroTextoB"\,3\,"parametroTextoC");)}

lunes, 28 de marzo de 2011

Eliminar un bloque de línea con sed saltándose unas líneas desde la línea que hace match

Por ejemplo tengo un fichero con el siguiente formato:

ficheroEntrada.txt:

aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...
aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...


Quiero/puedo encontrar las líneas con el patrón "aaaaaaaaa", y a partir de cada una, quiero eliminar el bloque de 3 líneas que se encuentran saltando 1 línea desde la línea que encajó con el patrón de búsqueda.

Para ello puedo ejecutar el siguiente script:

cat ficheroEntrada.txt | sed -e '/aaaaaaaaa/ {n;n;N;N;d}' > ficheroSalida.txt


Para cada línea que contiene el patŕon "aaaaaaaaa":

  • Con el primer n salta a la siguiente línea tras la línea que hizo match.

  • Con el segundo n alcanza la primera línea que nos interesa, desechando la anterior.

  • Avanza dos líneas más, pero esta vez agregándolas al pattern space. Por cada línea que agrega, mete delante de la línea el carácter salto de línea.

  • Una vez que hemos acumulado las 3 líneas que queríamos borrar en el pattern space, las borramos con el comando "d". Y aquí termina el ciclo de operaciones que se hace por cada línea "aaaaaaaaa" encontrada.

lunes, 21 de marzo de 2011

Jmeter - Variables compuestas con counter

Si queremos utilizar variables propias cuyo valor, o parte de éste esté en función de la variable counter, deberemos declarar nuestras variables, en vez de como "Config element -> User defined variables", como "Pre processors -> User parameters". Al parecer es debido a que las "user defined variables" se inicializan antes que el counter y probablemente una única vez por instanciación del hilo, mientras que las variables definidas en el pre processador, se generan cada vez (yo por ejemplo las puse como pre proceso de un controlador, así que se generan en cada invocación del controlador). Y como como el counter se inicializa antes que los pre-procesos, éstos ya pueden obtener el su valor correctamente. El counter, como elemento de configuración, se instancia antes que los pre-procesadores, aunque el elemento vaya colocado en el mismo nivel del árbol, detrás de los susodichos pre-procesadores.

Así podremos tener variables compuestas, definidas como MI_VARIABLE_${VAR_COUNTER}.

Yo por ejemplo, lo utilice para poder generar una batería de test para un conjunto de de nombres de usuario, uno distinto para cada iteración.

Ejemplo



Definí los posibles valores de usuarios en el nodo de "User Defined Variables". Para ello, todas las variables que quería recorrer con el controlador For, tienen el mismo prefijo, en este caso 'lolaUser' y tras el separador (también podría no haber usado el separador), números consecutivos.:

jmeter for controllerY luego en el For Controller, hago referencia a dichas variables, por el prefijo que comparten "lolaUser". Como he usado el separador, también he tenido que marcar la opción correspondiente. El valor para cada iteración se guarda en la variable especificada en el controlador FOR, en el registro "output variable name", en éste caso la llamé PROFILE, a la que posteriormente podré acceder dentro de los distintos nodos dentro del bucle con ${PROFILE}:

jmeter for controller