Testing backend

¿Qué hacemos con tanto test?

Un día normal...


...hasta que un (pequeño fix)...

y luego...

¿Quién ha sido?

¿Quién ha sido?

Vida real

Vida real

Tipos de errores

Negocio (clientes, managers, product owners) 🕴️💼
Programadores 👩‍💻👨‍💻
Usuarios 🧔🧑👩‍💼
Imprevisibles (sistema, hardware, red) 🤯💥

Negocio (clientes, managers, product owners)

  • Buena comunicación

  • Agile

  • Gherkin

Programadores

  • Formación
  • Patrones de diseño
  • Buenas prácticas
  • Code review
  • Testing
  • Pair/Mob programming

Usuarios

  • UI/UX
  • Estándar
  • Validaciones
  • Roles
  • Seguridad
  • Permisos

Usuarios

"El principal problema del software se encuentra detrás del teclado"

¿Imprevisibles?

🤯💥

Imprevisibles

Imprevisibles

  • try/catch
  • rollbacks
  • logs
  • Chaos Engineering 🐒🔫🔫

Chaos Engineering 🐒🔫🔫

Más información:

¿Para qué programamos?

🤔🤔

Optimización

Optimización

Buenas prácticas

Code smells

💩🪰

Muchos comentarios

Código duplicado

createUserAndSendEmail()

class Manager()

Spaghetti code

Código muerto

Muchos parámetros

Complejidad sin sentido

Nombres sin sentido

Principios/patrones...

🗞️📏

Keep It Simple, Stupid!

KISS

Cualquier sistema va a funcionar mejor si se mantiene sencillo que si se vuelve complejo

Sencillez tiene que ser la meta

Eliminar complejidad innecesaria

Don't Repeat Yourself

Evita duplicar código

Una pieza del código debe tener una única responsabilidad

You Aren't Gonna Need It

No lo vas a necesitar

Evita programar porsiacasos muy posiblemente no los vayas a necesitar

Design by contract

Las interfaces son tus amigas. ¡¡Úsalas!!

SOLID

Single Responsibility Principle

Open/Closed principle

Liskov substitution principle

Interface segregation principle

Dependency inversion principle

STUPID

Singleton

Tight coupling

Untestability

Premature Optimization

Indescriptive Naming

Duplication Naming

Funciones impuras

function sumador(suma = 0) {
  return function (cantidad) {
    suma = suma + cantidad;
    return suma;
  };
}
const sumadorA = sumador();
console.log(sumadorA(2));  // 2
console.log(sumadorA(2)); // 4

Funciones puras

function sumador(suma = 0) {
  return function (cantidad) {
    return suma + cantidad;
  };
}
const sumadorA = sumador();
console.log(sumadorA(2));  // 2
console.log(sumadorA(2)); // 2

Ventajas

Funciones puras

Son más fáciles de probar

Pueden ser cacheadas

Más fáciles de entender

Ejecutan en paralelo

Menos bugs, side effects

:::

¿A qué huele el buen software?

👃⛅😤

Integridad

Autodocumentado

Maleable

No cajas negras

Refactorizable

Una posible solución

  • Test unitarios

  • Integración contínua

  • Despliegue contínuo

Objetivos

  • Menos bugs
  • Implementaciones justas
  • Crear-diseñar código modular
  • Código susceptible al cambio
  • Código reutilizable
  • Menos pérdida de tiempo (pruebas humanas)

Ejemplo real

🔥🔫

Testing


Backend

"Dogma" de los tests unitarios

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

"Dogma" de los tests unitarios

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Sin dependencias externas

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Sin dependencias externas

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Sin dependencias externas

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Sin dependencias externas

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Alcance limitado

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Sin orden

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Test 1 - ✅ GetUsers y espero (3 users)

Test 2 - ✅ Insert User

Sin orden

Rápido

Sin dependencias externas

Binarios

Alcance limitado

Sirve como documentación

Sin orden

Test 1 - ✅ GetUsers y espero (3 users)

Test 2 - ✅ Insert User

Test 2 - ✅ Insert User

Test 1 - ❌ GetUsers y espero (3 users)

Test unitarios

Test unitarios

Siguiente escalón

Pero...

Pero...

...para eso no estaban los mocks?

Mocks

Mocks

Código de tests

Código de producción

Código de producción

Siguiente escalón


Pero...


Petición REST

Postman (newman)

Supertest

Manualmente

Buenos días $player1 este es tu primer día de trabajo y...

Tenemos una tienda online funcionando y queremos añadir nuevas funcionalidades

Pero antes… te explico cómo está el sistema:

Todos los items del inventario tienen un valor SellIn que indica los días para vender el artículo

Todos los items tienen un valor Quality que indica la calidad del item

Al final de cada día el sistema reduce SellIn y Quality de todos los items

Gilded Rose (refactor)

Somos ese $player1, así que lo primero que tenemos que hacer es entender el código y hacer una estimación.

⏰ (30 minutos)

Para ello:

  1. Descargamos el código: https://ralink.io/WDAvt
  2. Nos paramos a entenderlo y ver sus tests
  3. Hacer refactor para poder meterle mano

Gilded Rose

¿Fácil verdad? Vamos a poner un par de condiciones extra:

Una vez haya pasado el sellIn la calidad se degrada dos veces más rápido

Quality nunca puede ser negativa

"Aged Brie" incrementa su calidad con el tiempo

Quality no puede superar 50

“Sulfuras” no tiene que venderse o decrementar su calidad

“Backstage passes” y “Aged Brie” incrementan su calidad a medida que se acerca su SellIn.

Quality incrementa en 2 cuando días 10 o menos

Quality incrementa en 3 cuando días 5 o menos

Quality pasa a 0 cuando es el día del concierto

Supertest ejemplo

Teniendo como ejemplo el proyecto: https://ralink.io/noD4v

Añadir los tests de integración en vuestros proyectos