MSTEST0067 : éviter les appels bloquants synchrones dans le code de test

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.