Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| 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.