【问题标题】:Suppress stderr while running Mix Test in Elixir在 Elixir 中运行混合测试时抑制标准错误
【发布时间】:2015-07-01 15:12:39
【问题描述】:

我正在我的应用程序中处理多个外部进程。在测试期间,其中几个的 stderr 输出与我的测试消息和结果内联输出。我可以这样做:

mix test --trace 2> error.log

但是,当我这样做时,我失去了所有可爱的色彩。还有一些 Elixir 错误仍然出现,虽然不是全部(这对我来说很好)。

有没有更好的方法来抑制外部程序的错误而不影响混音输出?这甚至是个好主意吗?

或者我的测试不应该与真正的命令行实用程序进行交互?我问是因为那时我真的不再清楚我在测试什么。

更新:

下面是一个简化的函数和测试,以更好地说明这个概念。

功能:

@doc "Function takes a pre-routing rule as a string and adds it with iptables"
def addrule(pre_routing_rule)
  %Porcelain.Result{out: _output, status: status} = Porcelain.shell("sudo iptables -t nat -A #{pre_routing_rule}")
end

测试:

test "Removing a non-existent rule fails" do 
  Rules.clear
  assert {:error, :eiptables} == Rules.remove("PREROUTING -p tcp --dport 9080 -j DNAT --to-destination 192.168.1.3:9080")
end

此测试完美通过。然而,与测试消息一致,它也输出iptables: No chain/target/match by that name.。消息的确切位置也是不可预测的,并且这些消息大量使测试信息难以阅读。然后我重定向stderr,由于某种原因我失去了颜色编码,这也使得很难跟踪测试结果。

【问题讨论】:

  • 一个示例函数和测试将有助于集中回答这个问题。就目前而言,除了在 System.cmd 调用中重定向 stderr 的提示之外,回答太模糊了。
  • @FredtheMagicWonderDog 我已经添加了问题的基本说明。有帮助吗?
  • 是的,它很有帮助。

标签: unit-testing elixir elixir-mix


【解决方案1】:

我认为您应该在调用命令行实用程序时抑制这些错误消息,例如使用与问题中相同的方法。

颜色的缺乏与Elixir detects ANSI的方式有关:

[ANSI support] 默认为 false,除非 Elixir 可以在启动期间检测到 stdout 和 stderr 都是终端。

【讨论】:

  • 是的,我想是的。我只是想知道为什么我在测试中丢失了颜色编码。
  • Elixir 知道它何时向终端输出文本与文件相比,并在写入文件时删除使文本着色的位。见 IO.Ansi
【解决方案2】:

我一般建议您决定如何在系统调用中处理 stderr。发生的事情是测试框架捕获了标准输出,但没有捕获标准错误。

您可以在初始 Porcelain 调用中更改 stderr 的处理方式参见

Porcelain API Docs

【讨论】:

  • 只是对此的补充说明。 Porcelain 可以将 stderr 重定向到各种输出。但是,它仅在使用 Goon 驱动程序时有效。如果没有 goon 驱动程序,您只能将 stderr 重定向到输出(即将错误加入到 stdout)。 Goon 是一个单独的二进制文件,您需要在 PATH 或应用程序的工作目录中。
猜你喜欢
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2012-08-11
相关资源
最近更新 更多