Ejecutar pruebas en Elixir automaticamente

  • 491 - palabras
  • Publicado por Ivan Jaimes
  • 5 min

¿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