Herramientas y Frameworks interesantes de programación - Parte 3 Pruebas Automáticas
Tags: testing
Published: 2020-01-03 23:37:47

En esta tercera parte hablaré de algunas herramientas para programar código que pruebe nuestras aplicaciones. 

Si tu proyecto es mediano y esta en constante crecimiento recomiendo que programes código para revisar que tu código funciona correctamente. Este código se puede ejecutar cuando los programadores suben sus cambios o después de que liberas una nueva versión de tu sistema de forma automática.

Hay diferentes tipos de pruebas las unitarias que como su nombre lo dice prueban una solo función de tu sistema sin conexiones externas como bases de datos, archivos, otros sistemas, servicios, etc. 

Las pruebas de integración que prueban tu código ya integrado con bases de datos, otros sistemas, archivos, etc.

Las pruebas de usuario que simulan el comportamiento de los usuarios.

### Pruebas unitarias con .NET Core 

Si estas utilizando .Net Core con EF Core, puedes utilizar una base de datos en memoria con datos que creas manualmente para probar las reglas de negocio. 

Por ejemplo

```csharp
var options = new DbContextOptionsBuilder<CaducaContext>()
                 .ConfigureWarnings(x => x.Ignore
                  (InMemoryEventId.TransactionIgnoredWarning))
                  .UseInMemoryDatabase(databaseName: "TestCaduca").Options;
var context = new CaducaContext(options);
```

.Net cuenta con 3 frameworks para testing:

1. MSTest: Framework desarrollado por Microsoft no necesitas agregar nada adicional al Visual Studio
2. xUnit: Es un framework mas nuevo, gratis y open source que esta ganando popularidad con algunos conceptos como theory que te permite crear tus pruebas con parámetros y te permite priorizar los casos de forma más fácil. Necesita un paquete adicional para poder correr las pruebas.
3. nUnit: También es gratis, open source y necesita un paquete adicional para correr las pruebas. Es un framework el cual ya cuenta con muchos años y se integra bien con Selenium que te ayuda a probar tus aplicaciones web como usuario final.

En lo personal he utilizado los 3, solo cambia un poco la sintaxis entre uno y otro.

### Specflow para documentar tus pruebas 

Para las pruebas de integración o de usuario final que tienen pasos mas detallados y mas largos puedes utilizar <a href="https://specflow.org">Specflow</a> el cual te permite escribir código como si fueran casos de prueba para los usuarios por ejemplo:

Escenario: Sumar 2 números
   Dado que el primer número es 3
   Y el segundo número es 4
   Cuando realizo la suma de los 2 números
   El resultado debe ser 7

Con una extensión que se agrega a Visual Studio te genera un método por cada uno de los pasos que tu escribes, y a veces te detecta los números del ejemplo como variables para los métodos, es fácil cambiarlo por parámetros en caso de que no los detecte automáticamente.

Cuenta con opciones para obtener los datos mediante una tabla.

Solo esta disponible para Visual Studio para windows.

Se integra con Azure Dev Ops el cual es un sistema de administración de proyectos gratuito si tienes menos de 5 programadores, te permite correr tus pruebas automáticas.

Visual Studio te permite ejecutar las pruebas de una forma fácil y si tienes la  versión profesional te permite probar el código mientras lo vas tecleando. Para Visual Studio para Mac a mi parecer aún le falta ya que no muestra una información tan detallada o mas visual.

### Postman

[Postman](https://www.getpostman.com) en un programa open source multiplataforma que te permite probar tus Servicios REST y SOAP. Cuenta con opciones para agregar escenarios de prueba automáticos y que se ejecuten por ejemplo todos los días a las 10 am. También te genera páginas de documentación de tus Servicios.

### Pruebas de usuario final

Hay diversos frameworks y herramientas para realizar las pruebas de usuario

#### Selenium

Es uno de los que tiene mas tiempo y es de los mas conocidos, puedes agregar plugins a chrome o firefox y con una opción grabas los pasos que realizas en tu pantalla y puedes agregar opciones para comprobar los resultados de lo que vas grabando como por ejemplo que te muestre la página de inicio de tu sistema después del login.

También puedes exportar los pasos de tus pruebas a código c# o java, entre otros. Con el código puedes realizar las pruebas en diferentes navegadores. También se puede integrar a azure dev ops para probar tu sistema al terminar de subir las nuevas versiones de tu sistema.

#### Cypres

Es un framework mas moderno que funciona mas con javascript y también te permite probar con varios navegadores, y te graba un video con los pasos que se realizaron. Me parece mucho más sencillo que selenium. 

Puedes ver el video en inglés de la presentación en el evento de <a href="https://www.youtube.com/watch?v=GH9Dvo_BYkk">ngconf de angular del 2019</a> el cual esta muy interesante.

#### Jest

Este no lo he utilizado pero esta ganando mucha popularidad, el cual según su <a href="https://jestjs.io">página</a> es utilizado por empresas como Facebook, twitter, spotify, por lo cual valdría la pena darle una revisada.

### Frameworks de pago

Existen algunos otros como los desarrollados por <a href="https://www.devexpress.com/products/testcafestudio/">DevExpress (Test Café)</a>, o <a href="https://www.telerik.com/teststudio">Telerik Test Studio</a> los cuales tienen costo, mas me parece que con Cypress y Jest son muy buenas alternativas.

### Aplicaciones móviles

#### Xamarin.UITest

Para aplicaciones móbiles y xamarin esta <a href="https://docs.microsoft.com/en-us/appcenter/test-cloud/uitest/">Xamarin.UITest</a>. En el cual vas programando las acciones que haría un usuario.

#### Visual Studio App Center

Microsoft también cuenta con <a href="https://visualstudio.microsoft.com/es/app-center/">Visual Studio app center</a> el cual es de pago y te permite probar tus aplicaciones en dispositivos reales, y puedes distribuir las versiones de tus app a testers o usuarios que deseen probar las versiones beta de tus productos.

#### TestFlight

Para iOS existe la aplicación TestFlight el cual te permite agregar también usuarios beta para que prueben tus aplicaciones antes de publicarlos en la AppStore.

 
Puedes ver mi curso sobre .net core y Servicios REST mas a fondo sobre pruebas unitarias:

<a href="https://abi.gitbook.io/net-core/8.-pruebas-unitarias">Servicios REST con ASP.NET Core y Entity Framework Core - Pruebas unitarias </a>

Si deseas que escriba un artículo mas detallado sobre pruebas automáticas y alguna de las herramientas mencionadas puedes solicitarla agregando en un comentario el tema que desees que explique de forma individual