Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

martes, 4 de noviembre de 2008

Pruebas sobre la interfaz de usuario en aplicaciones Windows

Hay múltiples ocasiones en las que resulta necesario realizar pruebas sobre la interfaz de usuario de nuestras aplicaciones, y como bien saben quienes llevan a cabo desarrollo dirigido por pruebas (más conocido por su nombre anglosajón, Test Driven Development o, simplemente, TDD), esta capa del software, la más cercana al usuario, resulta más compleja a la hora de establecer una automatización sobre las pruebas. Existen, no obstante, opciones para llevar a cabo baterías de pruebas sobre la UI (User Interface), que dependerán del tipo de aplicación con la que estemos trabajando (consola, con interfaz gráfica, web…) y del lenguaje o plataforma de desarrollo. Hoy nos vamos a centrar en .NET y las pruebas en Windows Forms.


Una aplicación Windows en .NET no es más que una serie de clases, entre las que se incluirán controles de usuario y formularios, que van siendo presentadas e interactuando con el usuario a través de diversos eventos. La automatización de las pruebas, en este entorno, dependerá de ser capaces de simular la interacción del usuario con la aplicación a través de los propios controles de los formularios. Esto es factible, desde el propio código, si vamos instanciando los formularios y ejecutando sobre ellos determinadas acciones. Por ejemplo, podríamos crear un Formulario mediante


Form1 f = new Form1();

e interactuar con sus controles, bien porque conozcamos cómo se llaman, bien a través de reflexión. Sin embargo, al igual que para llevar a cabo pruebas unitarias sobre el código disponemos de frameworks tan adecuados como NUnit o XUnit.NET, para desarrollar pruebas sobre la UI podemos hacer uso de NUnitForms, una extensión de NUnit que permite realizar pruebas unitarias y de aceptación sobre aplicaciones Windows (Forms).


Si descargamos NUnitForms, veremos que además del propio framework, incorpora una aplicación llamada Recorder, que nos ayudará a “grabar” como si de una macro se tratase el test. Realmente sólo permite la grabación de tests básicos, por lo que si deseamos probar alguna funcionalidad más avanzada o un control de usuario específico que hayamos creado lo ideal será escribir la prueba a mano (o grabar una prueba más básica y ampliarla con aquellas características que el Recorder no haya sido capaz de gestionar). El funcionamiento es muy básico, y lo presentaremos mediante un ejemplo.


Imaginemos que deseamos comprobar el funcionamiento del siguiente formulario (Form1). Simplemente consta de una caja de texto (textBox1), un botón (button1), una lista (listBox1) y un par de etiquetas (label1, label2). El botón insertará en la lista los valores que vayamos escribiendo en el cuadro de texto. Una de las etiquetas contiene el valor constante “ítems”, y la otra se va actualizando con el número de elementos que contiene la lista.



El código del formulario es tan simple como esto:



[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestingUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(textBox1.Text))
{
listBox1.Items.Add(textBox1.Text);
label1.Text = listBox1.Items.Count.ToString();
}
}
}
}
[/csharp]


Por tanto, una prueba podría ser insertar uno o varios elementos en la lista, y comprobar que el valor de la etiqueta coincide con el esperado. Creamos la aplicación, la compilamos, y abrimos el Recorder. Pulsaremos sobre File, Load, y seleccionaremos el fichero .DLL o .EXE que contenga los formularios sobre los que llevar a cabo la prueba. En el desplegable de la parte superior del Recorder, seleccionamos el formulario a “lanzar”, y comenzaremos a interactuar con él.



Podremos ir viendo cómo el Recorder va “grabando” nuestras acciones sobre el formulario. Si en un momento dado queremos insertar una comprobación (un Assert), pulsaremos con el botón derecho del ratón sobre el control, y en el menú contextual seleccionaremos la propiedad del mismo sobre la que efectuar la comprobación. De este modo tendremos un método de prueba [Test] que insertar dentro del proyecto de pruebas con NUnit y NUnitForms. El código de la prueba generada quedaría así:



[csharp]
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using NUnit.Framework;
using NUnit.Extensions.Forms;

namespace TestingUITests
{
[TestFixture]
public class Form1Tests
{
[Test]
public void Test()
{

TextBoxTester textBox1 = new TextBoxTester("textBox1");
ButtonTester Form1_button1 = new ButtonTester("button1", "Form1");
LabelTester label1 = new LabelTester("label1");
FormTester Form1 = new FormTester("Form1");

textBox1.Enter("hola");
Form1_button1.Click();
textBox1.Enter("adios");
Form1_button1.Click();
Assert.AreEqual("2", label1.Properties.Text);
Form1.Close();
}

}
}
[/csharp]



Existe también una aproximación bastante interesante a las pruebas del UI en aplicaciones Windows mediante el uso de WF (Windows Workflow Foundation). El proyecto puede encontrarse en Codeproject, y merece la pena echarle un vistazo.


En el caso de las pruebas sobre la UI en aplicaciones web, contamos con frameworks de prueba como Selenium, que incorpora un plugin para Firefox para ayudarnos a crear las pruebas, de forma parecida al Recorder de NUnit. Pero esta es otra historia, que fue contada en otra ocasión ;) .

No hay comentarios:

Publicar un comentario