getsentry / getsentry/sentry-python

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

Abierto
#6,411 2 comentarios 0 reacciones 0 asignados Ver en GitHub
Python Tests
Lenguaje dominante
Python
Estrellas
2.2k
Forks
669
Merge medio
1 d 1 h
PR fusionados (30 d)
213

Descripción

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

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.