在 Elixir 中 运行 混合测试时抑制 stderr
Suppress stderr while running Mix Test in Elixir
我在我的应用程序中使用多个外部进程。在测试期间,其中几个的 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,由于某种原因我丢失了颜色编码,这也使得很难跟踪测试结果。
我认为您应该在调用命令行实用程序时抑制这些错误消息,例如使用与问题中相同的方法。
缺少颜色与 Elixir detects ANSI:
[ANSI support] is by default false unless Elixir can detect during startup that both stdout and stderr are terminals.
我一般建议您决定如何在系统调用中处理 stderr。发生的事情是测试框架捕获标准输出,但不是标准错误。
您可以更改在初始 Porcelain 调用中处理 stderr 的方式参见
我在我的应用程序中使用多个外部进程。在测试期间,其中几个的 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,由于某种原因我丢失了颜色编码,这也使得很难跟踪测试结果。
我认为您应该在调用命令行实用程序时抑制这些错误消息,例如使用与问题中相同的方法。
缺少颜色与 Elixir detects ANSI:
[ANSI support] is by default false unless Elixir can detect during startup that both stdout and stderr are terminals.
我一般建议您决定如何在系统调用中处理 stderr。发生的事情是测试框架捕获标准输出,但不是标准错误。
您可以更改在初始 Porcelain 调用中处理 stderr 的方式参见