如何在pytest中清除捕获的stdout / stderr?

时间:2019-05-17 13:13:24

标签: python pytest

我有一些带有断言的测试,每个断言有点像单独的测试,并且我不希望先前断言的输出污染当前失败断言的错误日志。

def test_foos(captured):
  foos = []  # some data
  for foo, bar in foos:
    captured.clear()
    assert logic(foo) == bar

我找到了caplog.clear(),但似乎没有用。

2 个答案:

答案 0 :(得分:1)

Parametrize your test。传递foos作为参数,pytest将多次运行测试assert,记录成功/失败,就好像每个测试都是单独的测试一样。

import pytest

testdata = [
    (3,9),
    (4,16),
    (5,25)
]

@pytest.mark.parametrize("x,expected", testdata)
def test_foos(x, expected):
    assert logic(foo) == bar # in the example, say logic squares the input

答案 1 :(得分:0)

我同意另一个答案,在您的情况下,使用pytest.mark.parametrize是最好的方法。但是,为了完整起见,您 可以使用capsys固定装置清除捕获的输出。

示例:

def logic(letter):
    print("Handling letter", letter)
    return letter.isupper()

def test_foo():
    letters = ["A", "b", "c"]
    for letter in letters:
        assert logic(letter)

测试将在"b"失败并打印:

----------------------------- Captured stdout call -----------------------------
Handling letter A
Handling letter b

为防止输出(成功)处理"A",我们可以在参数中添加capsys并使用capsys.readouterr清除介于两者之间的缓冲区:

def test_foo(capsys):
    letters = ["A", "b", "c"]
    for letter in letters:
        assert logic(letter)
        capsys.readouterr()

现在,测试仍然在"b"失败,但仅打印:

----------------------------- Captured stdout call -----------------------------
Handling letter b