Pytest:多个assert语句在同一测试函数中失败,如何知道是哪些assert语句导致失败?

0 投票
3 回答
31 浏览
提问于 2025-04-12 12:51

测试文件:

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%]

撰写回答