diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index 5859dd509..1868f0f7a 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -750,7 +750,7 @@ class AssertionRewriter(ast.NodeVisitor): the expression is false. """ - if isinstance(assert_.test, ast.Tuple): + if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) == 2: from _pytest.warning_types import PytestWarning import warnings diff --git a/testing/test_assertion.py b/testing/test_assertion.py index 2c7f4b33d..6a2a1ed38 100644 --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -1077,16 +1077,25 @@ def test_diff_newline_at_end(monkeypatch, testdir): @pytest.mark.filterwarnings("default") def test_assert_tuple_warning(testdir): + msg = "assertion is always true" testdir.makepyfile( """ def test_tuple(): assert(False, 'you shall not pass') """ ) - result = testdir.runpytest("-rw") - result.stdout.fnmatch_lines( - ["*test_assert_tuple_warning.py:2:*assertion is always true*"] + result = testdir.runpytest() + result.stdout.fnmatch_lines(["*test_assert_tuple_warning.py:2:*{}*".format(msg)]) + + # tuples with size != 2 should not trigger the warning + testdir.makepyfile( + """ + def test_tuple(): + assert () + """ ) + result = testdir.runpytest() + assert msg not in result.stdout.str() def test_assert_indirect_tuple_no_warning(testdir):