Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling exception in pytest fixture and pytest.fail vs assert in general

Consider you have something like the following:

import pytest

@pytest.fixture
def foo_fixture():
    assert x == 1, "X is not 1"
    if x != 1:
        pytest.fail("X is not 1")


def test_foo():
    assert x == 1, "X is not 1"
    if x != 1:
        pytest.fail("X is not 1")

Can someone please shed light on differences between raising errors via pytest.fail vs assert,
in both contexts - inside pytest.fixture or inside regular test function.

What is the difference, what is more right\common to do in each case?

Thank in advance

like image 806
JavaSa Avatar asked Oct 27 '25 02:10

JavaSa


1 Answers

The biggest difference is that pytest.fail() can't be caught and assert can:

for example - this test is going to pass:

def test_assert():
    try:
        assert False
    except:
        pass

and this test is going to fail:

def test_pytest_fail():
    try:
        pytest.fail('failed')
    except Exception:
        pass

Other than that I don't think there are more major differences because they both raise an AssertionError.

Anyway, I would suggest you use this library https://pypi.org/project/assertpy/ for more cleaner and readable assertions.

**** EDIT: ****

Guess I was wrong:

pytest.fail() can be caught by catching the specific exception Failed or just 'BaseException.

So - they both are ways to raise exceptions but from some reason Failed does not inherit from the generic Exception type. so pytest.fail() raises Failed exception and not AssertionError

like image 116
Tomer Cohen Avatar answered Oct 30 '25 08:10

Tomer Cohen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!