pytest-dev / pytest

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing
https://pytest.org
MIT License
12.07k stars 2.67k forks source link

Pytest reevaluates walrus operations within assert statements #11115

Open regananalytics opened 1 year ago

regananalytics commented 1 year ago

Ubuntu 22.04, pytest 7.3.2, python 3.10.11

Package Version


exceptiongroup 1.1.1 iniconfig 2.0.0 packaging 23.1 pip 23.1.2 pluggy 1.0.0 pytest 7.3.2 setuptools 67.8.0 tomli 2.0.1 wheel 0.38.4

Pytest 7.3.2 re-evaluates walrus operator statements if they appear in assert statements.

def test_walrus():
    assert (x := 2) == 2
    x  =  3
    assert x == 3, "This test fails because (x := 2) is reevaluated by pytest"

def test_walrus_no_assert():
    (x := 2) == 2
    x = 3
    assert x == 3, "This test passes because (x := 2) is not reevaluated"
The-Compiler commented 1 year ago

Bisected to 331bc1be4634cf95fdb33021d4355c35723b73fe:

As a workaround, --assert=plain works.

cc @aless10

aless10 commented 1 year ago

Oh no! I'm thinking that a lot of edge cases are really really "edge", and I hope that nobody writes tests like this one. But I'm going to look at this. Is that ok with you? Thanks

regananalytics commented 1 year ago

Yeah, this is obviously not a real test. I wrote it as a super simple and replicable example of the issue.

The-Compiler commented 1 year ago

@aless10 Sure, please go ahead! No worries, sometimes things can be unexpectedly tricky. It's much appreciated that you're taking care of those follow-up issues!

AdamVerner commented 2 weeks ago

Just came across this issue as well when using pytest = "^8.3.3" Took me couple of hours to find out what is going on...