Pruebas unitarias: interfaz de usuario ASP.NET
Llega el momento de ver lo que nos ofrece Visual Studio para hacer las pruebas sobre la capa de interfaz, en este caso sobre una interfaz ASP.NET.
Probar el 100% de la funcionalidad de la interfaz de usuario de manera automatizada es complicado con las herramientas que disponemos y siempre va a quedar una parte que obligatoriamente tendremos que cubrir con pruebas funcionales. Aún así, todo lo que podemos automatizar será tiempo que nos ahorraremos.
En este tipo de pruebas sigo un enfoque de pruebas de cobertura.
Una prueba unitaria de cobertura es aquella cuyo único objetivo es cubrir la mayor parte posible de código, sin realmente comprobar si el resultado de la prueba es el esperado. Este tipo de pruebas nos protegen contra errores graves, como excepciones inesperadas en el código.
Aunque siempre que sea posible es conveniente realizar pruebas de funcionalidad (comprueba que realmente hace lo que tiene que hacer) en algunos escenarios, como el que nos ocupa podemos usar este enfoque de cobertura.
Visual Studio nos permite grabar secuencia completas contra la interfaz de usuario, con el objetivo de poder repetirlas tantas veces como queremos. Este tipo de pruebas las podemos crear desde el menú de “Test”, creando una prueba de tipo Web.
Una vez terminada la grabación dispondremos de las secuencias grabadas para poder repetirlas tantas veces como queremos.
Desde el menú horizontal que se muestra en la imagen Visual Studio nos permite extender la funcionalidad de la prueba que acabamos de grabar; asociarle un datasource, añadir más grabaciones, convertir la prueba en código etc…
Una de las propiedades que nos interesa establecer es que cuando se inicie la prueba se arranque la aplicación ASP.NET para que la prueba pueda realizarse. Sino realizamos este paso la prueba fallará porque no encontrará la aplicación que queremos probar.
Desde una de las opciones de menú horizontal (Parametrizar servidor Web ) podemos indicarle que queremos que se arranque un servidor web de desarrollo cuando ejecutemos la prueba.
También desde el mismo menú podremos convertir la grabación que hemos realizar el código, para tener algo similar al código que aparece a continuación. En algunas ocasiones nos puede interesar tener la prueba en código para poder personalizarla según nuestras necesidades, por ejemplo, para hacer algún cambio respecto lo grabado.
[TestMethod]
[UrlToTest("http://localhost:20970/Default.aspx")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\UTDemo\\UTDemo", "/")]
public override IEnumerator<WebTestRequest> GetRequestEnumerator()
{
// Initialize validation rules that apply to all requests in the WebTest
if ((this.Context.ValidationLevel >= Microsoft.VisualStudio.TestTools.WebTesting.ValidationLevel.Low))
{
ValidateResponseUrl validationRule1 = new ValidateResponseUrl();
this.ValidateResponse += new EventHandler<ValidationEventArgs>(validationRule1.Validate);
}
WebTestRequest request1 = new WebTestRequest("http://localhost:20970/Default.aspx");
request1.ThinkTime = 5;
ExtractHiddenFields extractionRule1 = new ExtractHiddenFields();
extractionRule1.Required = true;
extractionRule1.HtmlDecode = true;
extractionRule1.ContextParameterName = "1";
request1.ExtractValues += new EventHandler<ExtractionEventArgs>(extractionRule1.Extract);
yield return request1;
request1 = null;
........
........
Fijaros en los atributos UrlToTest y AspNetDevelopmentServerHost. A través de estos dos atributos se consigue que cuando ejecutemos la prueba se arranque un servidor web de desarrollo con la aplicación web a probar.
Del mismo modo también, desde el menú horizontal, podríamos configurar una origen de datos para la prueba web, para que ciertos valores de la misma se carguen desde un origen externo a la prueba.
Por ejemplo, si tenemos un formulario de alta, cuando hemos grabado la prueba habremos metido ciertos valores, que son los que se han grabado. Nos puede interesar repetir la secuencia grabada pero que los datos utilizados no sean los mismos. En este caso podremos usar el origen de datos para que almacene los diferentes datos que queremos usar en la prueba.

Y para los que estéis pensando si existe algo parecido para interfaces WinForm, la respuesta es no, al menos hasta la salida de Visual Studio 2010.
Para los que necesitéis probar aplicaciones WinForm y no podáis esperar, os recomiendo este post de Rodrigo Corral.