Freigeben über


MSTEST0045: Verwenden einer kooperativen Stornierung für Timeouts

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.