Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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.