如何 运行 使用 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
背景
我有一个带有一些分支逻辑的小函数,我对它进行了一些测试。我想在 运行 给定测试时使用 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