ExUnit es el framework de pruebas integrado en Elixir, diseñado para ayudarte a escribir pruebas claras y efectivas. Desde pruebas unitarias hasta pruebas más complejas, ExUnit ofrece las herramientas necesarias para asegurar que tu código funcione como esperas.
ExUnit viene incluido con Elixir, por lo que no necesitas instalar dependencias adicionales. Solo asegúrate de que tu entorno de desarrollo esté configurado para ejecutarlas.
ExUnit.start()
Los archivos de pruebas suelen estar en el directorio test/ y deben tener el sufijo _test.exs.
Veamos un ejemplo:
defmodule MiApp.MiModuloTest do
use ExUnit.Case
test "una prueba simple" do
assert 1 + 1 == 2
end
end
Para ejecutar las pruebas, utiliza:
mix test
Las aserciones son fundamentales para comprobar el comportamiento esperado. ExUnit ofrece varias:
- assert: Verifica que una condición sea verdadera.
- refute: Verifica que una condición sea falsa.
- assert_raise: Verifica que se lance una excepción específica.
Veamos algunos ejemplos:
assert String.length("Hola") == 4
refute String.contains?("Hola", "mundo")
assert_raise ArgumentError, fn -> String.to_integer("no_numero") end
ExUnit permite convertir ejemplos en la documentación en pruebas automáticas.
defmodule MiModulo do
@doc """
Duplica un número.
## Ejemplo
iex> MiModulo.duplicar(2)
4
"""
def duplicar(n), do: n * 2
end
defmodule MiModuloTest do
use ExUnit.Case
doctest MiModulo
end
Para organizar tus pruebas, podemos usar describe:
defmodule MiApp.MiModuloTest do
use ExUnit.Case
describe "función suma/2" do
test "suma números positivos" do
assert MiApp.MiModulo.suma(2, 3) == 5
end
test "suma números negativos" do
assert MiApp.MiModulo.suma(-2, -3) == -5
end
end
end
Y podemos usar setup para definir configuraciones comunes:
defmodule MiApp.MiModuloTest do
use ExUnit.Case
setup do
{:ok, numero: 42}
end
test "usa datos de setup", %{numero: numero} do
assert numero == 42
end
end
Elixir soporta pruebas concurrentes por defecto. Si necesitas pruebas asincrónicas, podemos indícarlo:
defmodule MiApp.AsyncTest do
use ExUnit.Case, async: true
test "prueba concurrente" do
Task.async(fn -> :ok end)
|> Task.await()
|> assert == :ok
end
end
ExUnit facilita capturar salidas a consola y logs:
import ExUnit.CaptureIO
test "captura salida de IO.puts" do
salida = capture_io(fn -> IO.puts("Hola, mundo!") end)
assert salida == "Hola, mundo!\n"
end
import ExUnit.CaptureLog
test "captura logs" do
salida = capture_log(fn -> Logger.info("Esto es un log") end)
assert salida =~ "Esto es un log"
end
Para ejecutar pruebas individuales, podemos usar:
mix test test/mi_modulo_test.exs:10
ExUnit es una herramienta flexible y poderosa para escribir pruebas en Elixir. Desde las pruebas más básicas hasta configuraciones avanzadas, te ayuda a mantener un código confiable y fácil de mantener.