DEV Community

Marcio Lopes de Faria
Marcio Lopes de Faria

Posted on Edited on

Execute and Watch Elixir tests from iex.

EDIT: I came up with a even better way to debug Elixir code than using iex, check it here.

Interactive Driven Development, or REPL Driven Development is a really good way to approach programming, specially for developers that get distracted easily with time being expend out the main development loop or flow.

A way to do it in Elixir is just to use the fswatch as presented in Elixir Mix Test documentation, or using the excellent mix.test-watch library, but them don't work well with iex, the Elixir REPL, so why not do something else.

So I created some modules that can be imported on your iex through the ~/.iex.exs file and get the same benefits.

Just insert it on your ~/.iex.exs file:

And create a ~/.iex directory, placing this file on it:

There is an explanition about how to use it on the @moduledoc, but briefly you just need to call iex prepending the ~/.iex directory on the Elixir path:

  ELIXIR_ERL_OPTIONS="-pa $HOME/.iex" MIX_ENV=test iex -S mix
Enter fullscreen mode Exit fullscreen mode

The IExWatchTests.Helpers that is imported on ~/.iex.exs allows to call f and s and a to run failed, stale and all tests respectively.

You can call w to watch tests and uw to unwatch.

There is a really simple throttle mechanism that disallow run the suite concurrently.

That is all. Enjoy!

Top comments (4)

Collapse
 
alexandremcosta profile image
Alexandre Marangoni Costa •

Nice tip! Any idea on how to make Mix.Tasks.Test.run([]) to work on umbrella projects? Mine always output There are no tests to run

Collapse
 
marciol profile image
Marcio Lopes de Faria •

I need to figure out, but I think that must be simple.

Collapse
 
alexandremcosta profile image
Alexandre Marangoni Costa • • Edited

For some reason, I also can't import IExWatchTests.Helpers from .iex.exs

$ ELIXIR_ERL_OPTIONS="-pa $HOME/.iex" MIX_ENV=test iex -S mix
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Interactive Elixir (1.12.1) - press Ctrl+C to exit (type h() ENTER for help)
Error while evaluating: /Users/xxx/.iex.exs
** (CompileError) /Users/xxx/.iex.exs:11: module IExWatchTests.Helpers is not loaded and could not be found
Enter fullscreen mode Exit fullscreen mode

But if I comment this line and run it from iex, it works!

Thread Thread
 
marciol profile image
Marcio Lopes de Faria •

Yes, I wrote another post explaining why I concluded that this approach is less than ideal, because there is a lot of limitation on what you can do in .iex.exs. For example, there is a IEx.Helpers.import_if_available/2 to deal with it.