Testing: a dormir tranquilos

Aprendiendo los beneficios del testing

jeslopcru
Jesús LC

Jesús López

Ingeniero en Informática & Scrum Master

Nota:

Esto no es más que una recopilación de charlas relacionadas con el testing y sobre como escribir buenos tests

"Testing is a process of executing a program with the intent of finding errors... This definition of testing has many implications... it implies that testing is a destructive process, even sadistic process, which explains why most people find it difficult"

Glendford J. Myers (1979)

¿Por qué escribir test?

¿Cómo convencerte de que hay que escribir tests?

Es tu

Responsabilidad

Es tu Responsabilidad


  • Master chef: ¿Has probado el plato?
  • Hacer software que funciona
  • Poder hacer un cambio rápido y estar tranquilo de que no has roto nada
  • Eres ingeniero, es tu responsabilidad

Refactor


  • Cambiar código sin test es como hacer malabares con cuchillos
  • Los test nos proporcionan un arnés de seguridad
  • Cambiar por dentro sin que se vea afectado el comportamiento observado. La única manera de hacer esto es teniendo uns test que comprueben que todo sigue igual

Documentación


  • Es la mejor manera de saber cómo funciona nuestro sistema

Es una herramienta para Diseñar


  • Nos ayuda a definir los contratos/interfaces
  • Pensar: casos de error, exponer dependencias, dar soluciones concretas a problemas,...
  • Conocer principios SOLID, Principios del testing,...

Es Dinero


  • Salva dinero: menos bugs, ir con más seguridad,...
  • Al testear estamos haciendo una labor "sádica" de ver que eso funciona
  • Nos va a permitir ir más seguros porque tenemos una red de seguridad

"Bad code affect to your Customer"

Martin Fowler

Tipos de Tests

Mitos del testing


  • Los test incrementan la calidad del código Usar nombres apropiados y el código lo entiende cualquier compañero
  • El software testeado está libre de bugs Proporcionan un arnés para que se rompa nada que ya estaba funcionando
  • No me da tiempo de hacer tests pero si da tiempo a horas de debug y var_dump en producción
  • Los test son opcionales Forman parte de la tarea
  • Todo tiene que estar testeado Sólo lo que aporte valor

Pirámide del testing

Test Aceptación


  • Se hacen desde el punto de vista del usuario
  • Similares a lenguaje natural (Selenium, Behat)...
  • Frágiles

Test de integración


  • Prueban como 2 módulos se relacionan entre ellos
  • Son parecidos a los unitarios, sólo que interactuan con un sistema externo

Test unitarios


  • Un test unitario testea una clase
  • Testean una unidad: testear el estados y como trabaja con colaboradores
  • Deben ser aislados(isolated) de sus colaboradores
  • El scope debe ser pequeño

Se tarda mucho en aprender a programar... pues lo mismo se tarda en aprender a testear

Hay reglas que aplican en desarrollo que no aplican en testing, p.e. DRY

Carácteristicas test unitarios


  • Fast
  • Isolated
  • Repeteable
  • Self-verifing
  • Timely/Transparent

Test dobles


  • Stub Canned Response
  • Mocks Expectations
  • Spies Saved Information
  • Fakes Near to Real One
  • Dummy Not make Anything

Nombrar un Test


  • Directorio de Tests Unitarios Misma estructura que el código
  • Clases de Tests xxxTest
  • Clases de ayuda para los Tests xxProvider
  • Nombre de los métodos shouldReturnxx -> Describe lo que probamos

Reglas para escribir un Test


  • Given
  • When
  • Then

"When you are very thirsty, even dirty water will keep you alive"

J. B. Rainsbergerg

Antes de un refactor hacer unos pocos test aunque sean de aceptación

Antipatrones de Test


  • Anémico Probar los getter/setter de atributos de clase
  • Obeso Test pequeños que solo prueban 1 comportamiento -> Cuando el test falle: ¿Por qué falla el test?
  • Listillo Test con lógica if/random... fechas
  • Tartamudo Un test que testee el test...
  • No confiable Usar constantes de producción en los tests

A tener en cuenta a la hora de hacer tests


  • Test frágiles
  • Mockear demasiado
  • Test deben passar en cualquier máquina
  • Test no deben de ser dependientes