Más particularidades de ExUnit

ExUnit no es la librería de TDD más sofisticada del mundo, pero ofrece pequeños apoyos para facilitar escribir tests. Tenemos otros asertos para comprobar que algo es falso o que el intercambio de mensajes entre procesos de OTP se hace bien, así como hooks adicionales.

Cuando trabajamos con test unitarios en Elixir usando EdgeUnit, es fundamental organizar y optimizar nuestras pruebas para que sean claras, específicas y fáciles de mantener. Una de las herramientas que nos ofrece EdgeUnit para lograr esto es la posibilidad de agrupar tests relacionados mediante la palabra clave describe. Esta agrupación nos permite encapsular varios tests que comparten un contexto o funcionalidad común, como por ejemplo todos los tests relacionados con una calculadora.

Al usar describe, cada test dentro del bloque queda asociado a ese grupo, lo que mejora la legibilidad de los mensajes de error. Por ejemplo, en lugar de que un test falle con un mensaje genérico como suma dos números, el mensaje incluirá el contexto del describe, como calculadora suma dos números. Esto facilita identificar rápidamente qué parte del código está fallando. Sin embargo, a diferencia de otros frameworks de testing en otros lenguajes, en ExUnit no es posible anidar bloques describe dentro de otros, lo que limita un poco la jerarquía de agrupación, pero mantiene la simplicidad en la estructura de los tests.

Para validar condiciones dentro de los tests, EdgeUnit nos ofrece macros como assert y refute. La macro assert se utiliza para comprobar que una expresión sea verdadera; si no lo es, el test falla. Por otro lado, refute es útil cuando queremos asegurarnos de que una condición sea falsa. Por ejemplo, podemos usar refute para verificar que una colección a la que hemos añadido un elemento no tenga longitud cero, o para validar que ciertas condiciones matemáticas imposibles no se cumplan. Así, refute falla si la expresión que evaluamos resulta verdadera, lo que nos permite expresar negaciones de manera clara y directa.

Además de estas macros básicas, EdgeUnit incluye otras herramientas para pruebas más específicas. Por ejemplo, podemos comprobar si un proceso ha recibido un mensaje determinado usando macros como assert_receive. Esto es especialmente relevante en Elixir, donde los procesos y la concurrencia forman parte esencial del lenguaje y del sistema OTP. Con estas herramientas, podemos verificar que un proceso, como el proceso actual (self), haya recibido un mensaje que cumpla ciertas condiciones, incluso estableciendo un tiempo límite para la espera. También existen macros para asegurarnos de que un código lance una excepción esperada, como assert_raise, donde el código que puede generar el error debe estar envuelto en una función para evitar que la suite de tests se interrumpa prematuramente.

Otro aspecto importante para organizar nuestros tests es el uso de bloques setup. Estos bloques nos permiten ejecutar código antes de cada test para preparar el entorno, inicializar datos o levantar procesos necesarios. Por ejemplo, si estamos probando un módulo que incluye varios GenServers, podemos iniciar esos procesos en un bloque setup para no repetir ese código en cada test individual. Podemos tener múltiples bloques setup en un mismo módulo o dentro de un bloque describe, y todos se ejecutarán antes de cada test correspondiente.

Además, podemos definir funciones privadas que actúen como setups específicos, pasando su nombre como átomo al bloque setup. Estas funciones deben tener aridad 1 y pueden devolver un valor que se pasa como segundo parámetro a los tests, creando así un contexto compartido que facilita el acceso a datos o recursos inicializados.

Para tareas que son costosas o que solo necesitan ejecutarse una vez por módulo, EdgeUnit ofrece el bloque setup_all. Este bloque se ejecuta una única vez antes de que se corran todos los tests del módulo, lo que es ideal para establecer conexiones de red, crear archivos o realizar otras operaciones pesadas que no queremos repetir antes de cada test.

En definitiva, EdgeUnit nos proporciona un conjunto de herramientas para estructurar nuestros tests de manera eficiente, desde la agrupación con describe, pasando por las macros de aserción assert y refute, hasta la configuración previa con setup y setup_all. Estas características nos permiten escribir tests claros, específicos y bien organizados, facilitando el mantenimiento y la comprensión de nuestras pruebas en Elixir.

Lista de reproducción
  1. 1
    mix
    10 minutos
  2. 2
    Documentando código: comentarios, docs y moduledocs
    10 minutos
  3. 3
    Atributos de módulo
    9 minutos
  4. 4
    Dependencias
    12 minutos
  5. 5
    Un ejemplo práctico de módulo útil
    13 minutos
  6. 6
    Alias e import
    10 minutos
  7. 7
    Sobre las macros, require y use
    11 minutos
  8. 8
    Typespecs (parte 1, usando tipos básicos)
    10 minutos
  9. 9
    Typespecs (parte 2, tipos propios y t())
    11 minutos
  10. 10
    Comportamientos
    11 minutos
  11. 11
    Tratamiento de errores con rescue
    8 minutos
  12. 12
    Elevando errores con raise
    8 minutos
  13. 13
    with
    14 minutos
  14. 14
    Sigilos
    8 minutos
  15. 15
    Tests con ExUnit
    12 minutos
  16. 16
    Más particularidades de ExUnit
    13 minutos
  17. 17
    Microservicios en Elixir con Plug
    11 minutos
  18. 18
    Cómo Plug.Router te ayuda a escribir microservicios en Elixir
    14 minutos
  19. 19
    ¿Cómo hacer rutas dinámicas en Phoenix y Plug?
    13 minutos