我有一些带有断言的测试,每个断言有点像单独的测试,并且我不希望先前断言的输出污染当前失败断言的错误日志。
def test_foos(captured):
foos = [] # some data
for foo, bar in foos:
captured.clear()
assert logic(foo) == bar
我找到了caplog.clear(),但似乎没有用。
答案 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