Muy breve introducción al testing
Tags: testing, javascript, beginners, programming
Published: 2022-09-01 13:31:30

Cuanto más programo más convencido estoy de que el testing es una de las herramientas más útiles que tenemos los programadores a nuestra disposición. No conozco a nadie que haga tests correctamente que no este de acuerdo. Los tests automáticos ahorran tiempo, dinero, reducen la cantidad de errores, ayudan a diseñar, a razonar sobre el software, permiten eliminar deuda técnica con mayor seguridad y hasta sirven como especificación formal de los requisitos del software.

## ¿Qué es un test?

Imagínate que acabas de escribir un fragmento de código...

¿Cómo sabes que funciona? ¿Cómo sabes que hace lo se espera que haga?

La mayoría de la gente responderá que lo sabe porque lo ha probado. Porque han abierto el navegador, navegado hacia cierta sección de la app, rellenado un input, han hecho click en un botón y han comprobado que la app reacciona correctamente a esa interacción del usuario.

Seguramente tú mismo, has puesto un `console.log` para comprobar de alguna forma que una función hace lo que esperas. Especialmente si la función no tiene asociada ninguna interfaz gráfica por ejemplo _escribir una función que sume dos números_


```ts
function sum(a, b) {
	return a + b
}
```

En estos casos la mayoría de developers acabe utilizando la consola para comprobar que la función es correcta:

```ts
console.log( sum( 1, 2) )	// 3
console.log( sum( 2, 2) )	// 4
```


Vamos a analizar estos procesos... tanto en el primero donde el desarrollador prueba manualmente la app desde el navegador como en el de los console logs se repiten unos patrones comunes:

1. Se identifica la funcionalidad que se quiere probar.
2. Se ejecuta el software que contiene esa funcionalidad bajo unas condiciones controladas.
3. Se comprueba que el resultado obtenido es igual al resultado esperado.


Estoy seguro que más de uno identifica este comportamiento, si es así enhorabuena ya estás haciendo tests, el siguiente paso es **convertir estos tests manuales en tests automáticos.**

## Tests automáticos

La pregunta del millón es: ¿Podemos escribir un software que compruebe que otro software funciona correctamente?

En un principio puede parecer una locura escribir código para que pruebe otro código de forma automática. Sin embargo a medida que el software crece, las ventajas que ofrecen los tests automáticos son evidentes:

- Ayudan a detectar errores fácilmente.
- Nos sirven como documentación.
- Ayudan a razonar sobre el código y a mejorar el diseño.




## Tests runners

Supongamos que estamos convencidos de hacer tests automáticos. Lo primero que necesitamos es lo que se llama un "test runner", por definirlo de forma sencilla un test runner es una herramienta que nos permite definir y ejecutar nuestros tests automáticos. En el mundo del frontend los más conocidos son [jest](https://jestjs.io/) y [mocha](https://mochajs.org/).

Estos frameworks nos ofrecen entre otras cosas una función llamada [test](https://jestjs.io/docs/api#testname-fn-timeout) que nos permite nombrar, definir y ejecutar tests de forma sencilla o la función [expect](https://jestjs.io/es-ES/docs/expect) para comprobar que los valores obtenidos cumplen los requisitos esperados.

```ts
test('LA DESCRIPCION DEL TEST VA AQUI', () => {

// La implementación del test va aquí

});
```

Los tests runners también nos ayudan a ejecutar los tests y generan un informe diciendo cuántos tests han tenido el resultado esperado y cuántos de ellos han fallado.

## Ejemplo sencillo: La función replace

Los strings de javascript heredan una función [replace](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String/replace) de su prototipo que recibe dos parámetros, un string a reemplazar y el string que lo reemplazará.

¿Cómo lo probarías?

La respuesta es siempre la misma: **Haz exactamente lo mismo que harías si tuvieses que probar manualmente.**

En este caso seguramente definirías un string, llamarías al método replace y comprobarías (mediante un console.log) que el string final es el esperado. En el caso de los tests automáticos el proceso es el mismo:

```ts
// Utilizamos la funcion "test" para dar nombre a la prueba e implementarla
test('should replace a string with the new given string', () => {
	// Creamos un string conocido para ejecutar nuestra prueba
	const template = 'hello world';
	// Ejecutamos la función que queremos probar pasándole unos parámetros conocidos
	const actual = template.replace('world', 'testing');
	// Comprobamos que el resultado es el esperado
	expect(actual).toEqual('hello testing');
});

```

y eso es todo! Hemos escrito nuestro primer test.

Evidentemente esto no es mas que una pequeña introducción, pero la esencia es siempre la misma, intentar automatizar el proceso que seguiríamos para probar una funcionalidad manualmente.

## Conclusiones

- Inconscientemente los programadores realizan tests manuales. 
- Estos tests se pueden llegar a automatizar.
- Los tests automáticos son una de las mejores herramientas disponibles actualmente.