使用 Pytest 捕获 SystemExit 消息
Catch SystemExit message with Pytest
我正在使用 pytest 编写测试。我有一个情况,如果输入错误,某些函数会在终端上抛出 SystemExit
和一些错误消息。
我想针对抛出SystemExit
的情况编写测试,验证输出的错误信息中是否有特定的字符串。
代码如下:
def test_validate_input():
...
with pytest.raises(SystemExit) as error:
_validate_function(test_wrong_input)
assert error.value.code == 1
如果我 运行 验证一些输入的实际功能,我无法在 error
中获得我在命令行上获得的输出错误消息。请让我知道我在这里缺少什么。
编辑:
我正在调用一个 subprocess.call_output
到 运行 一个抛出错误的命令。我必须在 call_output
调用中添加 stderr=subprocess.STDOUT
作为参数来获取错误消息。然后我在测试中使用了@p3j4p5 的答案。
Pytest 的 raises()
采用 match
参数。文档告诉我们:
If specified, a string containing a regular expression, or a regular expression object, that is tested against the string representation of the exception
和
This is only used when pytest.raises
is used as a context manager
所以它应该适合你的情况:
def test_validate_input():
...
with pytest.raises(SystemExit, match='exception message content'):
_validate_function(test_wrong_input)
如果引发的 SystemExit
异常是通过与提供的正则表达式匹配的消息引发的,则此测试将通过,否则将失败。
或者,如果你想手动查看消息:
The context manager produces an ExceptionInfo
object which can be used to inspect the details of the captured exception
在您的情况下,假设调用 SystemExit
时使用整数(代码)和字符串(消息),即:
def test_validate_input():
...
with pytest.raises(SystemExit) as exc_info:
_validate_function(test_wrong_input)
assert exc_info.value.args[0] == 1
assert exc_info.value.args[1] == 'exception message content'
如果我没理解错的话,你的消息会在 在 SystemExit
出现之前打印在 stderr 上,在这种情况下你需要 capsys
def test_validate_input(capsys):
...
with pytest.raises(SystemExit) as error:
_validate_function(test_wrong_input)
assert error.value.code == 1
captured = capsys.readouterr()
assert captured.err == "Expected error message\n"
我正在使用 pytest 编写测试。我有一个情况,如果输入错误,某些函数会在终端上抛出 SystemExit
和一些错误消息。
我想针对抛出SystemExit
的情况编写测试,验证输出的错误信息中是否有特定的字符串。
代码如下:
def test_validate_input():
...
with pytest.raises(SystemExit) as error:
_validate_function(test_wrong_input)
assert error.value.code == 1
如果我 运行 验证一些输入的实际功能,我无法在 error
中获得我在命令行上获得的输出错误消息。请让我知道我在这里缺少什么。
编辑:
我正在调用一个 subprocess.call_output
到 运行 一个抛出错误的命令。我必须在 call_output
调用中添加 stderr=subprocess.STDOUT
作为参数来获取错误消息。然后我在测试中使用了@p3j4p5 的答案。
Pytest 的 raises()
采用 match
参数。文档告诉我们:
If specified, a string containing a regular expression, or a regular expression object, that is tested against the string representation of the exception
和
This is only used when
pytest.raises
is used as a context manager
所以它应该适合你的情况:
def test_validate_input():
...
with pytest.raises(SystemExit, match='exception message content'):
_validate_function(test_wrong_input)
如果引发的 SystemExit
异常是通过与提供的正则表达式匹配的消息引发的,则此测试将通过,否则将失败。
或者,如果你想手动查看消息:
The context manager produces an
ExceptionInfo
object which can be used to inspect the details of the captured exception
在您的情况下,假设调用 SystemExit
时使用整数(代码)和字符串(消息),即:
def test_validate_input():
...
with pytest.raises(SystemExit) as exc_info:
_validate_function(test_wrong_input)
assert exc_info.value.args[0] == 1
assert exc_info.value.args[1] == 'exception message content'
如果我没理解错的话,你的消息会在 在 SystemExit
出现之前打印在 stderr 上,在这种情况下你需要 capsys
def test_validate_input(capsys):
...
with pytest.raises(SystemExit) as error:
_validate_function(test_wrong_input)
assert error.value.code == 1
captured = capsys.readouterr()
assert captured.err == "Expected error message\n"