encode / django-rest-framework

Web APIs for Django. 🎸
https://www.django-rest-framework.org
Other
28.21k stars 6.81k forks source link

[self-tests] cleanup order of `TestUrlPatternTestCase` #9399

Closed stanislavlevin closed 4 months ago

stanislavlevin commented 4 months ago

tests/test_testing.py::TestUrlPatternTestCase::test_urlpatterns fails against pytest 8.2.0:

(base) [builder@localhost django-rest-framework]$ python runtests.py tests/test_testing.py::TestUrlPatternTestCase::test_urlpatterns -v 
max_value in DecimalField should be Decimal type.
min_value in DecimalField should be Decimal type.
================================ test session starts =================================
platform linux -- Python 3.12.2, pytest-8.2.0, pluggy-1.5.0 -- /usr/src/RPM/BUILD/django-rest-framework/.tox/venvs/base/bin/python
cachedir: .pytest_cache
django: version: 5.0.4
rootdir: /usr/src/RPM/BUILD/django-rest-framework
configfile: setup.cfg
plugins: cov-4.1.0, django-4.8.0
collected 1 item                                                                     

tests/test_testing.py::TestUrlPatternTestCase::test_urlpatterns PASSED         [100%]
tests/test_testing.py::TestUrlPatternTestCase::test_urlpatterns ERROR          [100%]

======================================= ERRORS =======================================
____________ ERROR at teardown of TestUrlPatternTestCase.test_urlpatterns ____________
tests/test_testing.py:323: in check_urlpatterns
    assert urlpatterns is not cls.urlpatterns
E   AssertionError: assert [<URLPattern ''>] is not [<URLPattern ''>]
E    +  where [<URLPattern ''>] = <class 'tests.test_testing.TestUrlPatternTestCase'>.urlpatterns
------------------------------- Captured stderr setup --------------------------------
Creating test database for alias 'default'...
Creating test database for alias 'secondary'...
------------------------------ Captured stderr teardown ------------------------------
Destroying test database for alias 'default'...
Destroying test database for alias 'secondary'...
================================== warnings summary ==================================
.tox/venvs/base/lib/python3/site-packages/_pytest/config/__init__.py:1448
  /usr/src/RPM/BUILD/django-rest-framework/.tox/venvs/base/lib/python3/site-packages/_pytest/config/__init__.py:1448: PytestConfigWarning: Unknown config option: testspath

    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
============================== short test summary info ===============================
ERROR tests/test_testing.py::TestUrlPatternTestCase::test_urlpatterns - AssertionError: assert [<URLPattern ''>] is not [<URLPattern ''>]
======================= 1 passed, 1 warning, 1 error in 0.63s ========================

This was revealed with recent change in pytest (8.2.0):

pytest-dev/pytest#11728: For unittest-based tests, exceptions during class cleanup (as raised by functions registered with TestCase.addClassCleanup) are now reported instead of silently failing.

This is actual problem of the test.

https://docs.python.org/3/library/unittest.html#unittest.TestCase.addClassCleanup

Add a function to be called after tearDownClass() to cleanup resources used during the test class. Functions will be called in reverse order to the order they are added (LIFO).

check_urlpatterns is called before cleanup_url_patterns and fails (problem was hidden by pytest < 8.2.0).

auvipy commented 4 months ago

thanks for the report and fix