MSTEST0075 : Éviter de modifier le répertoire actif dans un test parallélisé

Propriété Valeur
Identificateur de la règle MSTEST0075
Titre Éviter de modifier le répertoire actif 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 Oui, pour C# uniquement

Important

ResourceLockAttribute est prévu pour MSTest 4.4 et est disponible uniquement dans les versions préliminaires jusqu’à la publication de MSTest 4.4.0.

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, s’exécute sous, appelle Directory.SetCurrentDirectory ou affecte Environment.CurrentDirectory sans correspondance [ResourceLock] ni [DoNotParallelize].

Description de la règle

Le répertoire actif est global sur chaque système d’exploitation et, contrairement à la culture, n’a pas d’équivalent à portée de thread ou asynchrone. Test qui modifie le répertoire de travail de chaque test en cours d’exécution simultanément, et les chemins relatifs résolus ailleurs dans la suite pointent silencieusement à un emplacement incorrect.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

Comment corriger les violations

Déclarez pour [ResourceLock(WellKnownResources.CurrentDirectory)] sérialiser les tests en cours ou ajoutez-y [DoNotParallelize] pour refuser le test de parallélisation. Même avec un verrou, préférez passer des chemins absolus afin que le répertoire actuel n’ait jamais besoin de changer.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

Un correctif de code C# ajoute l’attribut [ResourceLock] pour vous, à la méthode de test ou, pour un élément d’étendue de classe tel que [TestInitialize], à la classe de test. Visual Basic code a ce diagnostic, mais n'a pas de correctif automatique ; ajoutez l'attribut manuellement.

Quand supprimer les avertissements

Ne supprimez pas les avertissements de cette règle sans déclarer un verrou ou refuser la parallélisation, car cela laisse la mutation s’enfuir 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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075

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.MSTEST0075.severity = none

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

Voir aussi