1

Background

I have a small function with some branching logic and I have some tests for it. I would like to use the erlang debugger when I run a given test to make sure I am executing the correct code.

Code

Lets assume we are testing DebuggerTest.greet/1:

defmodule DebugerTest do
  def greet(greeting) do
    if greeting == "Hola" do
      str = "#{greeting} mundo!"
      IO.puts(str)
      :spanish_greet
    else
      str = "#{greeting} world!"
      IO.puts(str)
      :normal_greet
    end
  end
end

Now, this function has some branching logic, and the code is overall horrible, but it does give us a lot of juicy executable lines that we attach a breakpoint to.

These are the tests I am running:

defmodule DebugerTestTest do
  use ExUnit.Case
  doctest DebugerTest

  test "greets the world" do
    assert DebugerTest.greet("Hello") == :normal_greet
  end

  test "greets the world in spanish" do
    assert DebugerTest.greet("Hola") == :fail_greet
  end
end

As you can see, my spanish greeting test will fail. However, I want to find that out using the erlang debugger: http://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/

Running the tests

Given that I am only interested in running the failing test, I change my code to:

@tag :wip
 test "greets the world in spanish" do
    assert DebugerTest.greet("Hola") == :fail_greet
  end

And then I run mix test --only wip.

There, now I am running only the failing test. But I am still not using the debugger. To try to fix this I tried running the tests via an iex shell iex -S mix test --only wip but the run is automated and it ends before I can setup the debugger:

:debugger.start()
:int.ni(DebugerTest)
:int.break(DebugerTest, 3)

Question

How can I run the erlang debugger when using mix test ?

Flame_Phoenix
  • 16,489
  • 37
  • 131
  • 266

1 Answers1

1

Answer

Turns out that if I modify my test in the following manner:


@tag :wip
test "greets the world in spanish" do
  :debugger.start()
  :int.ni(DebugerTest)
  :int.break(DebugerTest, 3)

  assert DebugerTest.greet("Hola") == :fail_greet
end

And then run it with mix test --trace --only wip the execution will launch the debugger and wait for it to finish.

Original answer can be found here:

https://elixirforum.com/t/how-to-run-exunit-tests-with-erlang-debugger/41162/4?u=fl4m3ph03n1x

Flame_Phoenix
  • 16,489
  • 37
  • 131
  • 266
  • 1
    Having spent the last hour or so banging my head against this, it's worth noting that the line number (`:int.break(Module, line_number)`) must be an _executable line_ and that isn't always obvious. The beginning of a multi-line pipeline, for example, is not considered executable. I was able to attach to an arbitrary line by adding `foo = 3` and attaching to that line. – voxobscuro May 17 '23 at 19:45