getsentry / getsentry/sentry-python

test(django): Remove @pytest.mark.forked dependency from Django integration tests

Đang mở
#6,411 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
Python Tests
Ngôn ngữ chính
Python
Star
2.2k
Fork
669
Merge trung bình
1 ngày 1 giờ
Pull request đã merge (30 ngày)
213

Mô tả

## Background

The Django integration test suite uses `@pytest.mark.forked` (via `pytest-forked`) on 52 tests across 5 files to isolate global state. This dates back to #522 ("Less boxed testing") and was a pragmatic substitute for proper teardown.

## Problem

`pytest-forked` is actively harmful in some scenarios:

- **Python 3.12 + asyncio + GitHub Actions:** Forking a multi-threaded process and then running an asyncio loop in the child causes silent hangs (the loop inherits dead threads). This consumed the full 30-minute CI budget on the Django ASGI tests until #6410 dropped `forked` from those 10 tests.
- **Slow:** Fork-per-test multiplies suite runtime.
- **Hides real isolation bugs:** Tests pass under fork but would fail under proper sequential execution, masking integration setup that isn't idempotent.

## Goal

Remove `@pytest.mark.forked` from every test under `tests/integrations/django/` and replace it with explicit isolation.

## Proposed approach

1. Extend (or autouse-wrap) the `sentry_init` fixture so the non-forked path also resets:
- `sentry_sdk.integrations._processed_integrations`
- `sentry_sdk.integrations._installed_integrations`
2. Add a `reset_django_state` fixture that snapshots and restores:
- `settings.MIDDLEWARE`
- Django signal receivers (`request_started`, `request_finished`, etc.)
- Anything else `DjangoIntegration.setup_once` connects
3. Audit `DjangoIntegration.setup_once` (and submodule patches under `sentry_sdk/integrations/django/`) for non-idempotent module-level patching.
4. Migrate test files one at a time: drop the marker, run, fix the resulting leaks, repeat.

## Current state

Files still using `@pytest.mark.forked` under `tests/integrations/django/` (count via `grep -rc`):

- `test_basic.py` (13)
- `test_cache_module.py` (14)
- `test_db_query_data.py` (10)
- `test_db_transactions.py` (12)
- `test_data_scrubbing.py` (3)

The ASGI subset (`tests/integrations/django/asgi/test_asgi.py`) was removed in #6410.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.