Pytest:多个assert语句在同一测试函数中失败,如何知道是哪些assert语句导致失败?
测试文件:
from RansomNote import Solution
def test_canConstruct():
sol = Solution()
assert sol.canConstruct('aa', 'aab') == True
assert sol.canConstruct('xx','aaabc') == True
assert sol.canConstruct('aab','ababa') == True
运行pytest -v后的输出:
==================================================================== short test summary info =====================================================================
FAILED Easy/test_ransomNote.py::test_canConstruct - AssertionError: assert False == True
======================================================================= 1 failed in 0.01s
问题: 首先,在同一个测试函数里有很多assert语句可以吗?还是不推荐这样做? 输出结果只显示了“断言错误”,那怎么知道到底是哪个assert语句导致了失败呢? 是不是每个assert语句都应该单独写一个新的测试函数比较好?
我尝试了pytest -v,想知道是哪个assert语句导致了失败。 输出结果: 失败了 Easy/test_ransomNote.py::test_canConstruct - AssertionError: assert False == True
3 个回答
0
Pytest会打印出紧跟在assert后面的字符串,所以你可以这样做:
from RansomNote import Solution
def test_canConstruct():
sol = Solution()
assert sol.canConstruct('aa', 'aab') == True, 'first one failed'
assert sol.canConstruct('xx','aaabc') == True, 'second one failed'
assert sol.canConstruct('aab','ababa') == True, 'third one failed'
0
你的输出结果中缺少了一些东西。
如果我用这段代码来重现你的问题:
def working_function():
return True
def failing_function():
return False
def test_some_function():
assert working_function()
assert failing_function()
运行 pytest -v
可以清楚地看到哪个断言语句失败了:
================================================================= FAILURES ==================================================================
____________________________________________________________ test_some_function _____________________________________________________________
def test_some_function():
assert working_function()
> assert failing_function()
E assert False
E + where False = failing_function()
test_assert.py:11: AssertionError
========================================================== short test summary info ==========================================================
FAILED test_assert.py::test_some_function - assert False
============================================================= 1 failed in 0.01s =============================================================
另外,这一点也要注意:
assert working_function()
这和下面的内容是完全一样的:
assert working_function() == True
也就是说,在你的 assert
语句中,没有必要加上 == True
。
1
你可以使用参数
@pytest.mark.parametrize("x, y", (("aa", "aab"), ("xx", "aaabc"), ("aab", "ababa")))
def test_canConstruct(x, y):
sol = Solution()
assert sol.canConstruct(x, y) is True
然后单独获取结果
x.py::test_canConstruct[aa-aab] PASSED [ 33%]
x.py::test_canConstruct[xx-aaabc] PASSED [ 66%]
x.py::test_canConstruct[aab-ababa] PASSED [100%]