MSTEST0076 : Éviter de muter la culture à l’échelle du processus dans un test parallélisé

Propriété Valeur
Identificateur de la règle MSTEST0076
Titre Éviter de muter la culture à l’échelle du processus dans un test parallélisé
Category Usage
Le correctif a un effet disruptif ou non disruptif Non-breaking
Activé par défaut Yes
Sévérité par défaut Informations
Introduit dans la version 4.4.0 (préversion)
Existe-t-il une correction de code No

Note

Cet analyseur s’active uniquement lorsque la parallélisation d’assembly est activée de manière syntactique, par exemple [assembly: Parallelize] sans correspondance [assembly: DoNotParallelize], ou lorsqu’un .editorconfig fichier définit mstest_parallel_safety_mode = always. L’analyseur ne peut pas détecter la parallélisation activée uniquement par le biais .runsettings de propriétés MSBuild telles que MSTestParallelizeWorkers. Définissez l’option si vous configurez la parallélisation de cette .editorconfig façon et souhaitez toujours que cet analyseur s’exécute.

Cause

Un test ou une méthode de montage délimitée par une classe sous laquelle il s’exécute, affecte DefaultThreadCurrentCulture ou DefaultThreadCurrentUICulture sans correspondance [ResourceLock] ou [DoNotParallelize].

Description de la règle

CultureInfo.DefaultThreadCurrentCulture et DefaultThreadCurrentUICulture définissez la culture par défaut pour l’ensemble du processus, de sorte que chaque test en cours d’exécution observe la modification, et la mise en forme ou l’analyse peut être endommagée. Les formulaires par thread et ambiant, etCurrentUICulture/CultureInfo.CurrentCulture ,/Thread.CurrentThread.CurrentCultureCurrentUICulture ne sont pas marqués : sur les .NET modernes, ils attribuent une AsyncLocalvaleur sauvegardée qui circule avec le contexte d'exécution, de sorte qu'ils n'endommagent pas les tests frères.

[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}

Étant donné que les setters avec indicateur sont à l’échelle du processus, la restauration de la valeur précédente dans un finally bloc n’aide pas : l’exécution simultanée de tests observe toujours la culture modifiée pendant la durée de la mutation.

Comment corriger les violations

Ajoutez [DoNotParallelize] le test ou évitez de muter la culture à l’échelle du processus et utilisez plutôt les propriétés de culture par thread ou ambiante.

[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}

Aucune clé connue [ResourceLock] n’existe pour la culture, donc une déclaration [ResourceLock] de n’importe quel type est traitée comme un accusé de réception que vous avez coordonné l’accès à la culture, et cette règle reste silencieuse.

Quand supprimer les avertissements

Ne supprimez pas les avertissements de cette règle sans désactiver la parallélisation ou basculer vers les propriétés de culture par thread, car cela laisse la mutation s’exécuter silencieusement contre les tests en cours d’exécution simultanée.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0076.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements d’analyse du code.

Voir aussi