Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| 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.