MSTEST0067: evitare di bloccare in modo sincrono le chiamate nel codice di test

Proprietà Value
ID regola MSTEST0067
Titolo Evitare di bloccare in modo sincrono le chiamate nel codice di test
Categoria Utilizzo
La modifica è dirompente o non dirompente Non-breaking
Abilitato per impostazione predefinita No
Gravità predefinita Informazioni
introdotta nella versione 4.3.0
È presente una correzione del codice No

Annotazioni

Questa regola è disponibile a partire da MSTest 4.3. Per impostazione predefinita, è disabilitata. È abilitato come avviso quando <MSTestAnalysisMode>All</MSTestAnalysisMode> è impostato.

Cause

Il codice di test usa una chiamata di blocco sincrono, Thread.Sleepad esempio , Task.WaitTask.WaitAll, Task.WaitAny, o Task<TResult>.Result.

La regola viene attivata sui metodi contrassegnati con TestMethodAttribute (inclusi gli attributi personalizzati che ereditano da esso) e sui metodi di fixture contrassegnati con TestInitializeAttribute, TestCleanupAttributeClassInitializeAttribute, ClassCleanupAttributeAssemblyInitializeAttributeAssemblyCleanupAttributeGlobalTestInitializeAttributee .GlobalTestCleanupAttribute

Descrizione regola

Bloccare in modo sincrono il thread corrente all'interno dei metodi di test o delle fixture di test è una causa comune di instabilità e può anche causare deadlock quando il framework di test esegue i test in un contesto di sincronizzazione che richiede una pianificazione cooperativa. Preferire await Task.Delay per le attese basate sul tempo e await l'attività per osservarne il risultato.

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

Come correggere le violazioni

Usare l'equivalente asincrono:

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

Quando eliminare gli avvisi

Questa regola è disabilitata di default. Se abilitata esplicitamente, sopprimere le singole occorrenze quando l'attesa sincrona è intenzionale e inevitabile, ad esempio quando si interagisce con un'API sincrona che non può essere resa asincrona.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.