Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Give warning when test function return other than None #9956

Merged
merged 16 commits into from May 25, 2022
Merged
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -63,6 +63,7 @@ Ceridwen
Charles Cloud
Charles Machalow
Charnjit SiNGH (CCSJ)
Cheuk Ting Ho
Chris Lamb
Chris NeJame
Chris Rose
Expand Down
1 change: 1 addition & 0 deletions changelog/7337.improvement.rst
@@ -0,0 +1 @@
Warns for test functions that return non-None. Now in `pytest_pyfunc_call` after the `async_warn_and_skip` it will check for if the return is something other than None.
Cheukting marked this conversation as resolved.
Show resolved Hide resolved
10 changes: 10 additions & 0 deletions src/_pytest/python.py
Expand Up @@ -77,10 +77,12 @@
from _pytest.pathlib import visit
from _pytest.scope import Scope
from _pytest.warning_types import PytestCollectionWarning
from _pytest.warning_types import PytestReturnNotNoneWarning
from _pytest.warning_types import PytestUnhandledCoroutineWarning

if TYPE_CHECKING:
from typing_extensions import Literal

from _pytest.scope import _ScopeName


Expand Down Expand Up @@ -192,6 +194,14 @@ def pytest_pyfunc_call(pyfuncitem: "Function") -> Optional[object]:
result = testfunction(**testargs)
if hasattr(result, "__await__") or hasattr(result, "__aiter__"):
async_warn_and_skip(pyfuncitem.nodeid)
elif result is not None:
warnings.warn(
PytestReturnNotNoneWarning(
"Test function returning {result}, do you mean to use `assert` instead or `return`?".format(
result=result
)
Cheukting marked this conversation as resolved.
Show resolved Hide resolved
)
)
return True


Expand Down
7 changes: 7 additions & 0 deletions src/_pytest/warning_types.py
Expand Up @@ -42,6 +42,13 @@ class PytestCollectionWarning(PytestWarning):
__module__ = "pytest"


@final
class PytestReturnNotNoneWarning(PytestWarning):
Cheukting marked this conversation as resolved.
Show resolved Hide resolved
"""Warning emitted when a test function is returning value other than None."""

__module__ = "pytest"


class PytestDeprecationWarning(PytestWarning, DeprecationWarning):
"""Warning class for features that will be removed in a future version."""

Expand Down
11 changes: 11 additions & 0 deletions testing/acceptance_test.py
Expand Up @@ -1292,3 +1292,14 @@ def test_no_brokenpipeerror_message(pytester: Pytester) -> None:

# Cleanup.
popen.stderr.close()


def test_function_return_non_none_warning(testdir) -> None:
testdir.makepyfile(
"""
def test_stuff():
return "something"
"""
)
res = testdir.runpytest()
res.stdout.fnmatch_lines(["*PytestReturnNotNoneWarning: Test function returning*"])