如何 运行 使用 erlang 调试器进行 ExUnit 测试?

How to run ExUnit tests with erlang debugger?

背景

我有一个带有一些分支逻辑的小函数,我对它进行了一些测试。我想在 运行 给定测试时使用 erlang 调试器来确保我正在执行正确的代码。

代码

假设我们正在测试 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

现在,这个函数有一些分支逻辑,代码总体上很糟糕,但它确实给了我们很多我们附加断点的多汁的可执行行。

这些是我正在做的测试 运行ning:

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

如您所见,我的西班牙语问候语测试将失败。但是,我想使用 erlang 调试器找到它: http://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/

运行 测试

鉴于我只对 运行失败的测试感兴趣,我将我的代码更改为:

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

然后我运行mix test --only wip.

好了,现在我 运行 只有失败的测试。但我仍然没有使用调试器。 为了解决这个问题,我尝试 运行 通过 iex shell iex -S mix test --only wip 进行测试,但是 运行 是自动的,它在我可以设置调试器之前结束:

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

问题

如何在使用 mix test 时 运行 erlang 调试器?

回答

事实证明,如果我按以下方式修改我的测试:


@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

然后 运行 它与 mix test --trace --only wip 执行将启动调试器并等待它完成。

原始答案可以在这里找到:

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