python / python/cpython

Add a decorator to run a test in an isolated subprocess

Ouverte
#152,548 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

tests type-feature
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Feature or enhancement

Some tests need to run in a fresh interpreter, isolated from the rest of the test run: they mutate process-global or interpreter state that would leak into (or be polluted by) other tests, depend on a clean interpreter startup, or may crash the interpreter outright. Today this has to be done ad hoc per test (spawning a child via script_helper, hand-rolling the result reporting), which is verbose and inconsistent.

I propose a decorator that runs a test in a dedicated subprocess and reports the result transparently, so the test reads like any other:

class MyTest(unittest.TestCase):
    @isolated()
    def test_global_state(self):
        ...

It would start in test.support and could later move to unittest.

Proposed behaviour

  • @isolated() decorates a test method (only that method runs in a subprocess) or a whole TestCase subclass (the whole class runs in a single subprocess, so setUpClass()/setUpModule() run once there).
  • Failures, errors and skips — including those of individual subTest()s — are reported for the corresponding test, and show the original subprocess traceback.
  • A setUpClass()/setUpModule() failure or skip in the subprocess is reported for the whole class.
  • The subprocess inherits the parent's regrtest configuration (enabled resources -u, memory limit -M, verbosity -v, failfast), so requires_resource(), requires(), bigmemtest() and similar behave the same in both processes.
  • A running_isolated flag is true while running in the subprocess, so setUp()/tearDown() and the class- and module-level fixtures can choose what to run there.

Linked PRs

Linked PRs
  • gh-152551
  • gh-152565
  • gh-152570
  • gh-152639
  • gh-154780
  • gh-154783
  • gh-154784
  • gh-155162
  • gh-155163
  • gh-155167
  • gh-155168
  • gh-155169
  • gh-155230
  • gh-155231
  • gh-155238

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le point d’entrée test.support et la gestion existante de subprocess dans script_helper. Examinez les pull requests liés ainsi que le comportement proposé du décorateur, notamment son utilisation avec des méthodes et TestCase, le rapport des résultats, la configuration regrtest héritée et running_isolated. C’est terminé lorsque les échecs, les tests ignorés, les fixtures, les subTests et les tracebacks de subprocess spécifiés sont signalés de manière transparente.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
testing
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.