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

[self-tests] cleanup order of TestUrlPatternTestCase #9399

Closed
stanislavlevin opened this issue May 6, 2024 · 1 comment · Fixed by #9400
Closed

[self-tests] cleanup order of TestUrlPatternTestCase #9399

stanislavlevin opened this issue May 6, 2024 · 1 comment · Fixed by #9400

Comments

@stanislavlevin
Copy link
Contributor

stanislavlevin commented May 6, 2024

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).

stanislavlevin added a commit to stanislavlevin/django-rest-framework that referenced this issue May 6, 2024
According to docs:
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).

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.

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

`doClassCleanups` can be used instead to check after-cleanup state:

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

> This method is called unconditionally after tearDownClass(), or after
  setUpClass() if setUpClass() raises an exception.

  It is responsible for calling all the cleanup functions added by
  addClassCleanup(). If you need cleanup functions to be called prior to
  tearDownClass() then you can call doClassCleanups() yourself.

Fixes: encode#9399
Signed-off-by: Stanislav Levin <slev@altlinux.org>
@auvipy
Copy link
Member

auvipy commented May 7, 2024

thanks for the report and fix

@auvipy auvipy closed this as completed May 7, 2024
auvipy pushed a commit that referenced this issue May 7, 2024
According to docs:
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).

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.

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

`doClassCleanups` can be used instead to check after-cleanup state:

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

> This method is called unconditionally after tearDownClass(), or after
  setUpClass() if setUpClass() raises an exception.

  It is responsible for calling all the cleanup functions added by
  addClassCleanup(). If you need cleanup functions to be called prior to
  tearDownClass() then you can call doClassCleanups() yourself.

Fixes: #9399

Signed-off-by: Stanislav Levin <slev@altlinux.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants