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é | Value |
|---|---|
| Identificateur de la règle | MSTEST0067 |
| Titre | Éviter le blocage synchrone des appels dans le code de test |
| Catégorie | Usage |
| Le correctif a un effet disruptif ou non disruptif | Non-breaking |
| Activé par défaut | No |
| Sévérité par défaut | Informations |
| Introduit dans la version | 4.3.0 |
| Existe-t-il une correction de code | No |
Note
Cette règle est disponible à partir de MSTest 4.3. Elle est désactivée par défaut. Il est activé comme avertissement lorsque <MSTestAnalysisMode>All</MSTestAnalysisMode> est défini.
Cause
Le code de test utilise un appel bloquant synchrone tel que Thread.Sleep, , Task.Wait, Task.WaitAllTask.WaitAny, ou Task<TResult>.Result.
La règle se déclenche sur les méthodes marquées avec TestMethodAttribute (y compris les attributs personnalisés qui en héritent) et sur les méthodes de fixture marquées avec TestInitializeAttribute, TestCleanupAttribute, ClassInitializeAttribute, ClassCleanupAttribute, AssemblyInitializeAttribute, AssemblyCleanupAttribute, GlobalTestInitializeAttribute et GlobalTestCleanupAttribute.
Description de la règle
Bloquer de manière synchrone le thread courant dans les méthodes de test ou les fixtures de test est une source fréquente d’instabilité des tests et peut également entraîner un interblocage lorsque le framework de test exécute les tests dans un contexte de synchronisation nécessitant une planification coopérative. Préférez await Task.Delay pour les temporisations et await la tâche pour en observer le résultat.
[TestClass]
public class TestClass
{
[TestMethod]
public async Task Test()
{
Thread.Sleep(1000); // Violation
var result = ComputeAsync().Result; // Violation
ComputeAsync().Wait(); // Violation
}
private static Task<int> ComputeAsync() => Task.FromResult(42);
}
Comment corriger les violations
Utilisez l’équivalent asynchrone :
[TestClass]
public class TestClass
{
[TestMethod]
public async Task Test()
{
await Task.Delay(1000);
var result = await ComputeAsync();
}
private static Task<int> ComputeAsync() => Task.FromResult(42);
}
Quand supprimer les avertissements
Cette règle est désactivée par défaut. Lorsqu’elle est choisie, supprimez les occurrences individuelles lorsque l’attente synchrone est intentionnelle et non évitable, par exemple lors de l’interaction avec une API synchrone qui ne peut pas être rendue asynchrone.
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 MSTEST0067
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0067
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.MSTEST0067.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements d’analyse du code.