martes, 29 de noviembre de 2016

Probando Aplicaciones Windows con WinAppDriver

La conferencia de desarrolladores de Microsoft de este año, la Connect(); //2016 ha estado llena de anuncios como la entrada de Microsoft en la Funcación Linux como miembro platino, la unión de Google y Samsung al grupo de dirección técnica de .Net Foundation, o la presentación del Visual Studio para Mac lo que más me llamó la atención fue una pequeña demo donde probaban aplicaciones de Windows.

Los más veteranos del lugar recuerdan Selienum, se utilizaba para hacer pruebas de interfaz de usuario web, elegías el navegador desde el que se quería probar y se ejecutaba la pruebas. Pues WinAppDriver utiliza Appium, una herramienta inspirada en Selenium que monta un servidor web  que es quien realmente ejecuta la aplicación y que expone un API Web con el que nos podemos comunicar. De tal manera que podemos usarlo con prácticamente cualquier tecnología (.Net, Java, etc)

En este post voy a utilizar xUnit y voy a hacer una prueba contra el notepad.
Antes de abrir el Visual Studio hay que instalar WinAppDriver, que se encuentra en  https://github.com/Microsoft/WinAppDriver/releases.
Una vez listo, creo un proyecto en Visual Studio de librería y añado la dependencia a xUnit y otra a Appium.

Para el test quiero probar que si se pulsan las teclas aparecen en pantalla. Lo primero que tengo que hacer en el test configurar appium y decirle que inicie la aplicación de notepad. Esto lo hago asi:

	//Ejecutar notepad
	DesiredCapabilities appCapabilities = new DesiredCapabilities();
	appCapabilities.SetCapability("app", @"C:\Windows\System32\notepad.exe");
	var NotepadSession = new IOSDriver(new Uri("http://127.0.0.1:4723"), appCapabilities);

¿Pero hacemos referencia a la zona editable del Notepadd. En Selenium se hacía referencia al DOM del HTML y teníamos métodos para identificar controles por nombre o id, aquí también los tenemos ¿pero como sabemos los nombres de los ids? La respuesta es inspect.exe que viene con el Windows SDK. Si tienes instalado el Visual Studio 2015 posiblemente lo tengas instalado ya que se instala por defecto y lo puedes encontrar en C:\Program Files (x86)\Windows Kits\10\bin\x86. Ejecutamos el notepad y después el inspect y veremos como cuando pulsamos en cualquier elemento del la pantalla, en el inspect aparecen las propiedades de dicho elemento. Por ejemplo si pulsamos en la zona editable del documento del notepadd aparecerá esto: image

Si nos fijamos vemos que nos muestra como ClassName un “Edit” asi que vamos buscar ese elemento por ClassName. Asi que hacemos las acciones que queremos realizar en el test y anotamos los controles y como los podemos identificar. Por ejemplo el test que hice quedó así:

    public class WindowsAppsTest
    {
        [Fact]
        public void LaunchNotepad()
        {
            const string texto = "SHAZAM!";
            //Ejecutar notepad
            DesiredCapabilities appCapabilities = new DesiredCapabilities();
            appCapabilities.SetCapability("app", @"C:\Windows\System32\notepad.exe");
            var NotepadSession = new IOSDriver(new Uri("http://127.0.0.1:4723"), appCapabilities);
            
            //Escribir algo 
            IOSElement documentoNotepad = NotepadSession.FindElementByClassName("Edit");
            documentoNotepad.SendKeys(texto);
            Assert.Equal(texto, documentoNotepad.Text);

            NotepadSession.FindElementByName("Cerrar").Click();

            NotepadSession.FindElementByName("No guardar").Click();
        }
        
    }

  • Abrimos la aplicación, identificamos la zona del documento en notepad con FindElementByClassName("Edit")
  • después escribimos el texto de prueba
  • comprobamos que el texto que enviamos está en pantalla con Assert.Equal(texto, documentoNotepad.Text);
  • hacemos click en el boton cerrar
  • hacemos click en el botón no guardar


Ya tenemos nuestro test listo, ahora lo que tenemos que hacer antes de lanzar nuestro test es iniciar nuestro servidor de appium, que arrancamos ejecutando WinAppDriver.exe que instalamos anteriormente y ya estamos listos para lanzar la prueba.
Es un poco trabajoso tener que hacer la prueba “manual” e ir anotando los controles involucrados buscar como se identifican, pero parece un conocimiento que los expertos en pruebas deberían tener. Si trabajáis en una gran empresa no estaría mal que hubiese un departamento de testing y sería ese departamento el encargado de diseñar y programar estas pruebas. Como es sabido, no es bueno que los propios desarrolladores prueben sus desarrollos. No porque no deben de hacer (que deben) si no porque están viciados con su perspectiva.
Os dejo un par de enlaces de la documentación oficial con pruebas en java y en .net

¿Qué opináis? ¿merece la pena?

Despues de leer el post y antes de publicarlo, decidí hacer un video para mostrar la ejecución del test que programamos

1 comentario: