JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD020 : SharedStaticAnyContext

PropriétéValeur
CatégorieReproductibilité (JustDummies.Reproducibility)
Sévérité🔵 Info
Activée par défautOui

Un AnyContext statique paraît maximalement déterministe — une graine littérale, là, dans le source — et ne l’est pas. La documentation d’AnyContext énonce elle-même le risque :

Un contexte peut être tiré concurremment sans danger, mais en partager un entre threads coûte le rejeu plutôt que les valeurs : des tirages entrelacés ne rendent stables ni la séquence ni le multiensemble d’une exécution à l’autre. Gardez un contexte à un seul thread à la fois.

Dans une suite qui exécute ses classes en parallèle, chaque test reçoit donc ce que l’entrelacement lui a donné. La graine est épinglée et l’exécution ne rejoue toujours pas.

Non conforme

private static readonly AnyContext Context = Any.WithSeed(1234);   // JD020

Conforme

// Un contexte par unité de travail…
AnyContext context = Any.WithSeed(1234);

// …ou la portée ambiante, qui suit le contexte d'exécution :
using IDisposable scope = Any.UseSeed(1234);

Ce qui n’est pas signalé

  • Un contexte d’instance, qui est par test par construction.
  • Un champ statique portant un générateur : la source aléatoire est résolue au moment de Generate(), jamais à la construction, donc une recette partagée est sûre et idiomatique.

Info plutôt qu’avertissement : un consommateur monothread — un exemple console, un benchmark, une classe sérialisée par [Collection] — en partage un sans dommage, et la règle ne voit pas la configuration de parallélisme de la suite.

Lire la source, ou la corriger là-bas ouvre un nouvel onglet· Repris depuis lib-v1.0.0-preview.6