Pruebas unitarias con ExUnit
Escriba pruebas unitarias rápidas y fiables para sus módulos y funciones de Elixir mediante el framework integrado ExUnit.
Pruebas unitarias con ExUnit es una lección gratuita de Elixir & Phoenix: Scalable Backend Development en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Elixir & Phoenix: Scalable Backend Development, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Elixir & Phoenix: Scalable Backend Development incluye 4 lecciones en total.
Partes de esta lección aún no han sido traducidas y se muestran en inglés.
Intro to ExUnit
Welcome to unit testing with ExUnit! ExUnit is Elixir's built-in testing framework, designed to help you write reliable and maintainable code.
Unit tests focus on small, isolated parts of your code, like individual functions or modules. They ensure each component works as expected, giving you confidence as your application grows.
Your First ExUnit Test
Elixir test files typically end with _test.exs and are placed in a test/ directory. Inside, you use ExUnit.Case to bring in testing functionalities.
A test block starts with test "description" do ... end. Here's a simple example:
defmodule MyMath do
def add(a, b), do: a + b
end
defmodule MyMathTest do
use ExUnit.Case, async: true
test "adds two numbers correctly" do
assert MyMath.add(1, 2) == 3
end
endAsserting with `assert`
The most common assertion in ExUnit is assert. It checks if an expression evaluates to a truthy value (anything other than false or nil).
You often use it to compare expected outcomes with actual results.
defmodule Calculator do
def multiply(a, b), do: a * b
end
defmodule CalculatorTest do
use ExUnit.Case, async: true
test "multiplies positive numbers" do
assert Calculator.multiply(2, 3) == 6
end
test "multiplies by zero" do
assert Calculator.multiply(5, 0) == 0
end
endRefuting with `refute`
Sometimes, you want to ensure something is not true. That's where refute comes in. It's the opposite of assert.
refute passes if its argument evaluates to a falsy value (false or nil).
defmodule Validator do
def is_negative(num), do: num < 0
end
defmodule ValidatorTest do
use ExUnit.Case, async: true
test "refutes positive numbers as negative" do
refute Validator.is_negative(10)
refute Validator.is_negative(0)
end
test "asserts negative numbers" do
assert Validator.is_negative(-5)
end
endTesting for Exceptions
What if your function is supposed to raise an error under specific conditions? assert_raise lets you test for that!
You provide the expected exception type and an optional message, along with a function that should trigger the error.
defmodule Divider do
def divide(a, b) do
if b == 0, do: raise(ArgumentError, "Cannot divide by zero"), else: a / b
end
end
defmodule DividerTest do
use ExUnit.Case, async: true
test "raises ArgumentError for division by zero" do
assert_raise ArgumentError, "Cannot divide by zero", fn ->
Divider.divide(10, 0)
end
end
endSetting Up Test Context
Many tests need common setup, like creating a temporary resource or a mock user. ExUnit's setup callback runs before each test in a module.
It should return {:ok, assigns} where assigns is a keyword list or map that will be available in your test function's arguments.
defmodule UserProfileTest do
use ExUnit.Case, async: true
setup do
# This runs before each test
user = %{id: 101, name: "Jane Doe", email: "jane@example.com"}
{:ok, user: user, admin: true}
end
test "user has a name", %{user: user} do
assert user.name == "Jane Doe"
end
test "context includes admin flag", %{admin: admin_status} do
assert admin_status == true
end
endGrouping Tests with `describe`
As your test files grow, you might want to logically group related tests. The describe macro helps organize tests within a module, making your test suite more readable.
You can even nest describe blocks!
defmodule StringUtils do
def capitalize(str), do: String.capitalize(str)
def reverse(str), do: String.reverse(str)
end
defmodule StringUtilsTest do
use ExUnit.Case, async: true
describe "capitalize/1" do
test "capitalizes first letter" do
assert StringUtils.capitalize("hello") == "Hello"
end
test "handles empty string" do
assert StringUtils.capitalize("") == ""
end
end
describe "reverse/1" do
test "reverses a string" do
assert StringUtils.reverse("world") == "dlrow"
end
end
endExecuting Your Tests
Once you've written your tests, running them is simple using Elixir's build tool, Mix.
- To run all tests in your project:
mix test - To run tests in a specific file:
mix test test/my_module_test.exs - To run a specific test by line number:
mix test test/my_module_test.exs:10 - To run tests matching a description:
mix test --only "adds two numbers"
ExUnit Challenge
Consider the following Elixir module designed to check if a number is odd. Which ExUnit assertion correctly tests if NumberChecker.is_odd(5) returns true?
defmodule NumberChecker do
def is_odd(n) when is_integer(n) do
rem(n, 2) != 0
end
endUnit Testing Summary
Great job! You've covered the fundamentals of unit testing with ExUnit.
- ExUnit is Elixir's built-in testing framework.
- Tests are defined in
_test.exsfiles usinguse ExUnit.Case. assertchecks for truthy values,refutefor falsy values.assert_raiseverifies that specific exceptions are thrown.setupcallbacks prepare context for your tests.describeblocks help organize related tests.- You run tests using
mix test.
These skills are crucial for building robust and reliable Elixir applications!
Preguntas frecuentes
¿La lección «Pruebas unitarias con ExUnit» es gratis?
Sí — el texto completo de «Pruebas unitarias con ExUnit» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Elixir & Phoenix: Scalable Backend Development, actualiza a CoddyKit PRO. El curso de Elixir & Phoenix: Scalable Backend Development incluye 4 lecciones en total.
¿Qué aprenderé en «Pruebas unitarias con ExUnit»?
Escriba pruebas unitarias rápidas y fiables para sus módulos y funciones de Elixir mediante el framework integrado ExUnit. Practicas Elixir & Phoenix: Scalable Backend Development con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Elixir & Phoenix: Scalable Backend Development?
No se requiere experiencia previa. Elixir & Phoenix: Scalable Backend Development en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Pruebas unitarias con ExUnit»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Elixir & Phoenix: Scalable Backend Development?
Sí. Cada lección de Elixir & Phoenix: Scalable Backend Development incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Pruebas unitarias con ExUnit
- Pruebas de integración de aplicaciones Phoenix
- Mocks, stubs y datos de prueba
- Pruebas basadas en propiedades con StreamData