如何在unittest中从subprocess.check_call()中停止AssertionError消息

时间:2017-10-02 21:02:33

标签: python python-unittest

我有一个使用subprocess.check_call调用脚本的测试。我在脚本中有断言检查参数的有效性,我想检查错误情况。所以我做到了这一点:

try:
    self.assertRaises(subprocess.CalledProcessError, subprocess.check_call, ['myscript.py', 'myBadArgument'])
except AssertionError:
    pass

测试实际上已经过了,因为正确的断言被引发,但是我想保持断言消息和相关的堆栈转储被打印到屏幕上。

我该怎么做? 谢谢!

2 个答案:

答案 0 :(得分:3)

要抑制子进程的错误消息,请重定向其stderr:

from subprocess import DEVNULL

with self.assertRaises(subprocess.CalledProcessError):
    subprocess.run(['myscript.py', 'myBadArgument'], stdout=DEVNULL, stderr=DEVNULL)

另外,不要抓住AssertionError。这没有做任何事情来抑制子进程的错误消息;即使子进程没有引发错误,它也只会导致测试错误传递。

答案 1 :(得分:1)

这里的问题是我过度使用assert()声明。我正在使用assert来检查用户是否向我提供了存在的文件,或者在脚本中有意义的值。

这是我的误解。我现在看到正确的方法是检查数据并在我的库元素中引发适当的异常,然后在面向用户的脚本中捕获这些异常并提供无调用堆栈的消息。

一旦我清理了这个,我的测试通过了正确的例外,没有不需要的消息。