Tuesday, January 26, 2016

Javascript Herramienta Poderosa de Ayuda Automation

Javascript esta muy de moda en estos días, y no es para menos, las potencialidades que tiene con WEB son impresionantes y van creciendo día a día.

Tengo este formulario grande de llenar, y debo automatizarlo. Imaginense que me pidieron automatizar el siguiente formulario:

Click aca


Largo, aburrido y tedioso de automatizar, una de las cosas mas tediosas es buscar elemento por elemento para ser reconocido luego por selenium, explorar los objetos, obtener su ID, o su XPATH, tomaría buen tiempo, pero porque no aplicar un simple truco Javascript, y obtener todos los XPATHs + ID's de los objetos y así los tenemos todos para automatizarlos directamente?

Copy Paste del script de abajo en el console de un browser, y ya esta hecho, el resultado como se muestra en la figura, son mas de 30 campos, que explorando objeto por objeto nos llevaría demasiado tiempo, con un simple script se pueden hacer cosas realmente interesantes. Nos ahorramos el trabajo de minimo 4 horas a 2 mins.  Saludos.:


//Script:

var elements = document.getElementsByTagName('input');
for(var index = 0;index<elements.length;index++)
{
    var element = elements.item(index);
    console.log(createXPathFromElement(element) + ' ' + element.value);
}


function createXPathFromElement(elm) {
    var allNodes = document.getElementsByTagName('*');
    for (var segs = []; elm && elm.nodeType == 1; elm = elm.parentNode)
    {
        if (elm.hasAttribute('id')) {
                var uniqueIdCount = 0;
                for (var n=0;n < allNodes.length;n++) {
                    if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++;
                    if (uniqueIdCount > 1) break;
                };
                if ( uniqueIdCount == 1) {
                    segs.unshift('id("' + elm.getAttribute('id') + '")');
                    return segs.join('/');
                } else {
                    segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]');
                }
        } else if (elm.hasAttribute('class')) {
            segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]');
        } else {
            for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) {
                if (sib.localName == elm.localName)  i++; };
                segs.unshift(elm.localName.toLowerCase() + '[' + i + ']');
        };
    };
    return segs.length ? '/' + segs.join('/') : null;
};

function lookupElementByXPath(path) {
    var evaluator = new XPathEvaluator();
    var result = evaluator.evaluate(path, document.documentElement, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    return  result.singleNodeValue;
}

Thursday, July 30, 2015

Modificando Response antes que llegue a una App

MODIFICANDO EL RESPONSE DE UNA PAGINA WEB / JSON RESPONSE / WEBSERVICE.

Muchas veces nos ha pasado que ya sea por negative testing, o parametrización que no se puede hacer con un servicio necesitamos modificar el valor de un response de un servicio web, para ver el comportamiento del navegador o de una app cliente. Podemos usar fiddler para ello. Un truco no muy conocido pero bastante útil.

1.- Bajar fiddler (http://www.telerik.com/download/fiddler)
2.- Estamos testeando la aplicacion winamp, y cada ves que busquemos una radio nos devuelve la lista de radios disponibles ejemplo:


Cada ves que buscamos una radio se genera un request al servidor en este caso: http://www.shoutcast.com/Search/UpdateSearch 

La cual nos devuelve un texto JSON la cual esta contenida mediante la recolección vía Fiddler:

3.- Abrimos el editor de scripting de Fiddler, el cual nos permite hacer javascript sobre los Request y Responses de Fiddler (Para ello Fiddler Rules->Customize Rules), en este caso modificaremos el response con el código siguiente:

En el query anterior estamos reemplazando cualquier texto que contenga "name":"blablablabla" o "name":"0199291" con el texto en chino. Usamos expresiones regulares para ello, lo cual trataré de escribir en otro POST.

4.- Guardamos y ejecutamos otra ves la búsqueda en winamp y en ves de salirnos las radios nos sale sus nombres en chino, así de esta forma podemos interceptar un paquete que viene de respuesta, cambiarlo y que el cliente lo interprete, y haga las operaciones que debe.
Resultado final  nombres de la radio en Chino :) :





Testeando Renderizado de WebSites

TESTEANDO RENDERIZADO DE WebSites?

En el caso de software testing muchas veces nos hemos visto en la necesidad de testear como nuestra página WEB se vería en otros idiomas (rendering), la solución aunque algo manual no puede ser más simple para el caso de navegadores de escritorio. Es prácticamente Copy Paste, probablemente mucha gente ya conoce pero para los que no conocen:


  1. Abren su página Ejemplo: http://www.mintrabajo.gob.bo/Principal.asp
  2. Editan con F12 y abren developers tools ( Chrome)
  3. Simplemente cambian el texto que quieren a otro en un diferente lenguaje ;) y es todo. No necesitan ni cambiar settings si lo que quieren hacer es testear renderizado :)

RESULTADO FINAL:

MAS FACIL IMPOSIBLE, SI LO QUE QUIEREN HACER ES TESTEAR COMO SE VERIA SU WEB EN OTRO LENGUAJE O CON OTRO TEXTO. CERO CIENCIA.

Monday, October 20, 2014

Diferencias conferencias de Test a nivel mundial.

Muchas conferencias de test existen en Europa y USA, de las cuales una de las más famosas ha ido perdiendo credibilidad, gracias al feedback de sus asistentes.

La famosa Eurostart Conferences cuyo contenido es más que todo a nivel de teorías de test, y poca información realmente útil para los testers:

http://www.eurostarconferences.com/conferences/2014/conference-at-a-glance

En cambio existe otra conferencia dedicada a embedded systems en Bilbao - España donde son invitados grandes expositores de diferentes compañías de renombre. cuyos contenidos son extremadamente útiles:

http://www.qatest.org/es/programme/programme.php

Juzgue por el contenido de su programa en ambos casos.

Friday, July 18, 2014

Debuggeando Procesos y Servicios desde el momento de su ejecución.

Depurar procesos, servicios, etc es una tarea común en Software Development in Test y Development en si, pues nos permite aislar los bugs para de esta forma poder corregirlos.

La tarea a simple vista es simple, pues si queremos depurar procesos corriendo simplemente se utiliza Debug->Attach To Process, escogiendo el proceso en cuestión y podemos depurar como se desee.

El problema radica cuando el inicio de un proceso o ejecutable no depende de nosotros, como ser un servicio, o un worker process, o procesos en lote que se inician aleatoriamente, y el problema o crash ocurre directamente al momento de tan solo iniciarlos no dando tiempo para poder hacerles attach.

En este caso existe una solución simple:
  1. Abrir el registro del sistema: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  2. Ejemplo, queremos que el proceso mspaint.exe se inicie para ser depurado desde un principio, para lo cual configuramos como se ve en la figura.
  3. En este caso queremos que nuestro debugger por defecto sea Visual Studio, para lo cual creamos una clave de registro del tipo string que se llame Debugger el cual contiene vsjitdebugger.exe como se muestra en la figura:
  4. A partir de este momento cada ves que se inicie nuestra aplicación se iniciará preguntando en que proyecto de Visual Studio nuestra aplicación puede ser depurada. Esto es aplicable para debuggers como Procdump. y windbg y de esta forma no perderemos los bugs que se producen nada más al iniciarse la aplicación
Nota: En servicios es necesario cambiar su modo a interactivo para de esta forma poder depurarlos de forma adecuada, esto se hace simplemente configurando en services.msc, de acuerdo a lo requerido. Pueden existir casos en que el servicio se inicia en una sesión distinta a nuestra sesión, en estos casos debe aplicarse debugging remoto vía pipes o vía tcp, el cual es aplicable a Windows Debugger, este caso se verá más adelante (especialmente pasa con Windows 8.1)

Wednesday, July 16, 2014

Testeo Combinatorial de APIs, + Combinando Reflection.

Testear librerias y API, puede llegar a ser un trabajo tedioso debido a la cantidad de parámetros y sus posibles combinaciones que pueda soportar, el presente artículo muestra como se puede testear un método, CreateFile con sus diferentes posibles combinaciones.

Comenzamos escribiendo un algoritmo que devuelve las posibles combinaciones de diferentes objetos, en este caso no especificaremos ningún tipo pues necesitamos que nuestro algoritmo sea lo más genérico posible.

La ventaja del algoritmo mostrado es su generalidad, pues no necesita pasarle tipos específicos. Un ejemplo de uso del algoritmo anterior, puede darnos la potencia combinando con Reflection como se muestra el ejemplo en el cual estamos testeando FileCreate(string Path, int bufferSize, FileOptions).

Generamos una combinatoria con todos los posibles parametros el cual nos da casi total cobertura del mismo.

Como se ve el algoritmo se adaptaría automáticamente a cualquier cambio en los tipos enumerados en FileOptions, el cual también es aplicable a Actions, la salida del algoritmo anterior seria la combinatoria:

Dado que este algoritmo soporta objetos sin tipo específico es posible combinar tipos del tipo MethodInfo, para invocar acciones genéricas de tal forma generar métodos de test más poderosos a través de un assembly adaptador de test.

El objetivo de este artículo fué mostrar la potencia de nuestros test al combinar Reflection con test Combinatoriales, para lograr un gran porcentaje de cobertura. Se dará un ejemplo de como lograr este objetivo en artículos más adelante.

Friday, July 11, 2014

Capturando tráfico webservices del dispositivo móvil desde fiddler.

Como sabemos Fiddler es una herramienta muy poderosa para captura de tráfico Web/WebServices.

Dada la naturaleza de la aplicación Fiddler, esta inicia como un servidor proxy, razón por la cual podemos configurar aplicaciones externas o de diferentes dispositivos con su proxy redirigido hacia el equipo que tiene fiddler iniciado.

  1. Iniciar Fiddler.
  2. Ir al menú Tools->Options->Connections->Allow Remote Computers to Connect.
  3. Averiguar la IP del equipo que tiene fiddler iniciado, usando IPConfig por ejemplo.
  4. Configurar el dispositivo móvil para que el tráfico pase por el servidor fiddler en la imagen se ve 192.168.0.2, el cual deberia ser 192.168.0.13 : 
  5. En este momento estamos listos para capturar tráfico web / webservices del dispositivo móvil (Ejemplo app Weather en iPhone).