MSTEST0067: Undvik synkront blockerande anrop i testkoden

Property Value
Regel-ID MSTEST0067
Title Undvik synkront blockerande anrop i testkoden
Kategori Användning
Korrigeringen är antingen brytande eller icke-brytande Non-breaking
Aktiverad som standard No
Standard allvarlighetsgrad Info
introducerades i version 4.3.0
Finns det en kodkorrigering No

Anmärkning

Den här regeln är tillgänglig från och med MSTest 4.3. Som standard är den inaktiverad. Den aktiveras som en varning när <MSTestAnalysisMode>All</MSTestAnalysisMode> anges.

Orsak

Testkoden använder ett synkront blockerande anrop som Thread.Sleep, Task.Wait, Task.WaitAll, Task.WaitAnyeller Task<TResult>.Result.

Regeln utlöses för metoder som markerats med TestMethodAttribute (inklusive anpassade attribut som ärver från det) och för fixturmetoder som markerats med TestInitializeAttribute, TestCleanupAttribute, ClassInitializeAttribute, ClassCleanupAttribute, AssemblyInitializeAttribute, AssemblyCleanupAttribute, GlobalTestInitializeAttribute och GlobalTestCleanupAttribute.

Regelbeskrivning

Att synkront blockera den aktuella tråden i testmetoder eller testfixturer är en vanlig källa till instabilitet och kan också leda till dödläge när testramverket kör tester i en synkroniseringskontext som kräver kooperativ schemaläggning. Använd await Task.Delay för tidsbaserade väntetider och await aktiviteten för att övervaka dess resultat.

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

Så här åtgärdar du överträdelser

Använd den asynkrona motsvarigheten:

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

När du ska ignorera varningar

Denna regel är inaktiverad som standard. När funktionen är aktiverad kan du undertrycka enskilda förekomster när den synkrona väntan är avsiktlig och inte går att undvika, till exempel när du använder ett synkront API som inte kan göras asynkront.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.