2

我正在使用 pytest 编写测试。我有一种情况,SystemExit如果输入错误,某些函数会在终端上抛出一些错误消息。

我想为抛出的情况编写测试SystemExit并验证输出错误消息中是否存在特定字符串。

这是代码:


def test_validate_input():
  ...
  with pytest.raises(SystemExit) as error:
    _validate_function(test_wrong_input)
  assert error.value.code == 1

error如果我运行验证某些输入的实际功能,我无法在命令行上获得输出错误消息。请让我知道我在这里缺少什么。

编辑:

我正在调用 asubprocess.call_output来运行一个引发错误的命令。我必须stderr=subprocess.STDOUTcall_output调用中添加作为参数来获取错误消息。然后我在测试中使用了@p3j4p5 的答案。

4

2 回答 2

3

如果我理解正确,您的消息会在引发之前 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"
于 2021-03-16T12:42:47.080 回答
1

Pytestraises()需要一个match参数。文档告诉我们:

如果指定,则包含正则表达式或正则表达式对象的字符串,该字符串针对异常的字符串表示进行测试

这仅在pytest.raises用作上下文管理器时使用

所以它应该适合你的情况:

def test_validate_input():
  ...
  with pytest.raises(SystemExit, match='exception message content'):
      _validate_function(test_wrong_input)

SystemExit如果引发的异常已通过与提供的正则表达式匹配的消息引发,则此测试将通过,否则将失败。

或者,如果您想手动检查消息:

上下文管理器生成一个ExceptionInfo对象,可用于检查捕获的异常的详细信息

在您的情况下,假设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'
于 2021-03-16T11:03:52.297 回答