MSTEST0067: Voorkom synchrone blokkering van aanroepen in testcode

Property Value
Regel-ID MSTEST0067
Title Vermijd synchrone blokkering van aanroepen in testcode
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld No
standaardniveau van ernst Informatie
geïntroduceerd in versie 4.3.0
Is er een oplossing voor de code No

Note

Deze regel is beschikbaar vanaf MSTest 4.3. Deze is standaard uitgeschakeld. Dit wordt als waarschuwing weergegeven wanneer <MSTestAnalysisMode>All</MSTestAnalysisMode> is ingesteld.

Oorzaak

Testcode maakt gebruik van een synchroon blokkerende oproep, zoals Thread.Sleep, Task.Wait, Task.WaitAll, Task.WaitAny of Task<TResult>.Result.

De regel wordt geactiveerd op methoden die zijn gemarkeerd met TestMethodAttribute (inclusief aangepaste kenmerken die ermee worden overgenomen) en op armaturen die zijn gemarkeerd met TestInitializeAttribute, TestCleanupAttribute, ClassInitializeAttribute, ClassCleanupAttribute, , AssemblyInitializeAttribute, , AssemblyCleanupAttributeen GlobalTestInitializeAttributeGlobalTestCleanupAttribute.

Beschrijving van regel

Het synchroon blokkeren van de huidige thread binnen testmethoden of testfixtures is een veelvoorkomende bron van instabiel testgedrag en kan ook een deadlock veroorzaken wanneer het testframework tests uitvoert op een synchronisatiecontext waarvoor coöperatieve planning vereist is. Geef de voorkeur await Task.Delay aan wachttijden op basis van tijd en await de taak om het resultaat ervan te bekijken.

[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);
}

Hoe schendingen op te lossen

Gebruik het asynchrone equivalent:

[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);
}

Wanneer waarschuwingen onderdrukken

Deze regel is standaard uitgeschakeld. Wanneer hiervoor is gekozen, kunt u afzonderlijke gevallen onderdrukken wanneer synchroon wachten opzettelijk is en niet kan worden vermeden, bijvoorbeeld wanneer u werkt met een synchrone API die niet asynchroon kan worden gemaakt.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable MSTEST0067
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0067

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0067.severity = none

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.