MSTEST0077 : éviter les chemins de système de fichiers codés en dur ou partagés dans un test parallélisé

Propriété Valeur
Identificateur de la règle MSTEST0077
Titre Éviter les chemins de système de fichiers codés en dur ou partagés 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

Important

TestContext.TestTempDirectory 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 réussit un chemin absolu constant, ou un littéral de chemin d’accès relatif, directement à une méthode de mutation File.*/Directory.* de système de fichiers, telle que File.WriteAllText ou .Directory.CreateDirectory

Description de la règle

Un chemin constant codé en dur ou relatif cible un emplacement partagé par tous les autres tests dans l’assembly. Sous parallélisation dans l’assembly, deux tests peuvent ensuite écrire dans le même emplacement simultanément et entrer en collision.

[TestMethod]
public void WritesReport()
{
    File.WriteAllText("report.txt", contents); // Violation
}

Seuls les chemins d’accès constants statiquement transmis à une API mutante sont marqués. Les lectures, la construction de chemins et les chemins générés à partir de variables sont laissés pour vous permettre de passer en revue manuellement, car l’analyseur ne peut pas savoir si deux tests se sont réellement collidés sur un chemin calculé.

Comment corriger les violations

Utilisez un emplacement unique par test, tel que TestContext.TestTempDirectory, au lieu d’un chemin fixe ou relatif.

[TestMethod]
public void WritesReport()
{
    string path = Path.Combine(TestContext.TestTempDirectory!, "report.txt");
    File.WriteAllText(path, contents);
}

Quand supprimer les avertissements

Il est sûr de supprimer cet avertissement si le chemin cible intentionnellement un dispositif que chaque test lit mais qu’aucun test n’écrit simultanément, ou si les tests qui écrivent dessus sont déjà coordonnés, par exemple via [DoNotParallelize].

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 MSTEST0077
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0077

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

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

Voir aussi