Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Property | Value |
|---|---|
| Regel-ID | MSTEST0045 |
| Title | Verwenden Sie eine kooperative Stornierung für Timeouts |
| Category | Usage |
| Korrektur ist blockierend oder nicht-blockierend | Non-breaking |
| Standardmäßig aktiviert | Yes |
| Voreingestellte Schwere | Hinweis (Warnung in 4.0) |
| wurde in Version eingeführt. | 3.10.0 |
| Gibt es eine Codekorrektur | Yes |
Cause
Eine Testmethode wird verwendetTimeoutAttribute, ohne die CooperativeCancellation Eigenschaft auf true zu setzen.
Regelbeschreibung
Es gibt keine Möglichkeit, einen ausgeführten Thread ordnungsgemäß abzubrechen. Es gibt zwei Möglichkeiten, wie ein Timeout funktioniert:
- Beenden Sie die Beobachtung des Threads, der den Test ausführt. Dies kann jedoch in vielen Fällen problematisch sein und die verbleibenden Tests aufgrund potenzieller Rennbedingungen instabil machen. Dies ist nicht kooperative Stornierung.
- Anfrage stornieren, sobald das Timeout erreicht ist, und es liegt in der Verantwortung des Tests, auf Anfrage zu beenden. Dies ist eine kooperative Kündigung.
Bei der Verwendung von TimeoutAttribute sollten Sie CooperativeCancellation auf true setzen, um kooperative Beendigung zu aktivieren. Ohne kooperative Beendigung hört das Testframework auf, die Testausführung zu beobachten, wenn das Timeout erreicht ist, der Test wird jedoch weiterhin im Hintergrund ausgeführt. Dies kann zu Problemen bei anderen Tests oder Bereinigungsschritten führen, da der ursprüngliche Test noch ausgeführt wird und nachfolgende Vorgänge beeinträchtigen kann.
Wenn Sie den kooperativen Abbruchmodus verwenden, löst MSTest nur den Abbruch des Tokens aus, und Sie sind für die Weiterleitung und Nutzung des Testkontexttokens in Ihrem Testcode verantwortlich. Dieser Modus richtet sich an das Standardverhalten des Abbruchs in .NET.
Wie man Verstöße behebt
Verwenden Sie den bereitgestellten Code-Optimierer, um die Eigenschaft CooperativeCancellation auf dem true automatisch auf TimeoutAttribute zu setzen. Sie können die Eigenschaft auch bei Bedarf manuell hinzufügen.
[TestClass]
public class TestClass1
{
public TestContext TestContext { get; set; }
[Timeout(TimeoutValue, CooperativeCancellation = true)]
[TestMethod]
public void TestMethod1()
{
// Respect TestContext.CancellationTokenSource.Token
}
}
Alternativ können Sie den kooperativen Abbruch global in Ihren Runsettings oder testconfig.json Datei konfigurieren, um diese Einstellung auf alle Timeoutattribute in Ihrem Testprojekt anzuwenden.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie diese Warnung, wenn der Test explizit abrupt beendet werden muss, wenn das Timeout erreicht wird, anstatt eine kooperative Beendigung zu verwenden.