Translate

Mostrando las entradas con la etiqueta ExUnit. Mostrar todas las entradas
Mostrando las entradas con la etiqueta ExUnit. Mostrar todas las entradas

domingo, 1 de diciembre de 2024

Creación de pruebas en Elixir con ExUnit


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.