mix test.watch

Ejecutar pruebas en Elixir automaticamente

Tue, 08 Dec 2020

iver.mx

¿Que es mix test.watch?

Es una tarea para ejecutar pruebas cada vez que cambian los archivos de origen. Para tener acceso a esta tarea se debe hacer lo siguiente:

Instalar la dependencia con mix:

# En el archivo mix.exs
 defp deps do
    [
    {:mix_test_watch, "~> 1.0", only: :dev, runtime: false},
    ..
    ]
  end

y ejecutamos mix deps.get:

$ mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
Unchanged:
  ..
  mix_test_watch 1.0.2
  ...
All dependencies are up to date

Ahora podemos ejecutar la instrucción mix test.watch:

$ mix test.watch

Running tests...
..............

Finished in 0.2 seconds
14 tests, 0 failures

Randomized with seed 285645

Con lo anterior el cursor permanecerá parpadeando y en espera de que cambie algún archivo para que se ejecuten nuevamente las pruebas. Aquí la ventaja es que en cuestión de milesimas de segundos tendrás el resultado de la prueba y sabrás que está fallando.

..

  1) test messages list_messages/0 returns all messages (Contact.APITest)
     test/contact/api_test.exs:26
     Assertion with == failed
     code:  assert API.list_messages() == contact
     left:  [%API.Contact{__meta__: #Ecto.Schema.Metadata<:loaded, "messages">, email: "some email", id: 200, inserted_at: ~N[2020-12-09 00:16:28], message: "some message", name: "some name", updated_at: ~N[2020-12-09 00:16:28]}]
     right: %API.Contact{__meta__: #Ecto.Schema.Metadata<:loaded, "messages">, email: "some email", id: 200, inserted_at: ~N[2020-12-09 00:16:28], message: "some message", name: "some name", updated_at: ~N[2020-12-09 00:16:28]}
     stacktrace:
       test/contact/api_test.exs:28: (test)

...........

Finished in 0.7 seconds
14 tests, 1 failure

Randomized with seed 240462

Opciones interesantes

  • --seed Ejecutar la prueba de manera aleatoria puede ser de ayuda, sin embargo cuando una prueba falla lo mejor es usar la opción --seed 0 de esta manera se ejecutaran las pruebas en la misma secuencia que la prueba anterior. En caso de que conozcas el seed puedes usarlo con esta opción, el seed del ejemplo anterior es 240462.

  • --max-failures Posiblemente quieras probar varios escenarios al mismo tiempo, sin embargo lo mejor es detenerse en la prueba a la primer falla. Para esto --max-failures 1 es tu amigo.

  • --stale Ejecuta las pruebas que hacen referencia a módulos que cambiaron desde la última vez que se ejecutaron las pruebas con --stale.

En general hay más opciones que se pueden consultar con mix help test.

Ahora las notificaciones

Existe un proyecto que permite concentrarnos en el código y nos hace saber cuando fallan las pruebas. Se llama ex_unit_notifier.

NOTA: Para que funcione apropiadamente se requiere lo siguiente:

Empezamos instalando la dependencia:

# En mix.exs
def deps do
  [{:ex_unit_notifier, "~> 0.1", only: :test}]
end

Se actualizan las dependencias:

$ mix deps.get

Y por último se agrega ExUnitNotifier a la configuración de ExUnit en el archivo test/test_helper.exs.

ExUnit.configure formatters: [ExUnit.CLIFormatter, ExUnitNotifier]
ExUnit.start()

Ahora si ejecutamos las pruebas:

mix test.watch --stale --max-failures 1 --trace --seed 0

Podremos ver las notificaciones cuando falla:

Test failed

o cuando pasa:

Test success

Referencias:

Bibliografía recomendada

Testing Elixir

Loading...
Iván Jaimes

Iván Jaimes Padre, esposo y desarrollador de software. Programa en go y elixir (por gusto), js (por necesidad) y shell (por diversión).