Nunit: Korrekte Testergebnis-Ausnahmemeldung beim Drücken von `TimeoutAttribute`

Erstellt am 25. Mai 2021  ·  3Kommentare  ·  Quelle: nunit/nunit

Hallo Leute,

in letzter Zeit habe ich mit dem TimeoutAttribute experimentiert und bin bei meinen Tests auf einige Zeitüberschreitungen gestoßen. Ich habe nur ein Exception doesn't have a stacktrace als Testergebnis-Meldung gesehen, was mich auf den ersten Blick verwirrt hat. Dann wurde mir klar, dass der Test das Timeout erreichte.

Ich habe versucht, in den Code einzudringen, um zu sehen, ob die Implementierung einer Timeout-Ausnahmemeldung möglich ist, aber bisher nichts gefunden.

Daher würde ich gerne eine bessere Testergebnisnachricht vorschlagen, wenn das Timeout erreicht wird.

Code zum reproduzieren:

[Test]
[Timeout(1000)]
public async Task Timeout()
{
    // Arrange

    // Act
    await Task.Delay(2000).ConfigureAwait(false);

    // Assert
    Assert.Pass();
}

Danke und nette Grüße

bug normal

Alle 3 Kommentare

Hallo @Prodigio

Wie führen Sie die Tests aus (VS, Dotnet-Test oder Konsolen-Runner), auf welches Framework zielen Sie ab und welche Versionen von NUnit, NUnit3TestAdapter und Konsolen-Runner verwenden Sie?

Ein anfängliches Überfliegen des Codes könnte darauf hindeuten, dass wir für dotnet core nicht die Nachricht setzen, sondern nur das Label. Vergleichen (Frameworkflow)
https://github.com/nunit/nunit/blob/b34eba3ac1aa6957157857bddd116256c634afab/src/NUnitFramework/framework/Internal/Commands/TimeoutCommand.cs#L83
gegen (dotnet core flow)
https://github.com/nunit/nunit/blob/b34eba3ac1aa6957157857bddd116256c634afab/src/NUnitFramework/framework/Internal/Commands/TimeoutCommand.cs#L110 -L113

Vergleichen Sie auch den Unterschied in den Tests TimeoutCausesOtherwisePassingTestToFailWithoutDebuggerAttached() . Dotnet-Framework-Version
https://github.com/nunit/nunit/blob/b34eba3ac1aa6957157857bddd116256c634afab/src/NUnitFramework/tests/Attributes/TimeoutTests.cs#L297 -L299
Dotnet-Core-Version
https://github.com/nunit/nunit/blob/b34eba3ac1aa6957157857bddd116256c634afab/src/NUnitFramework/tests/Attributes/TimeoutTests.cs#L367 -L369

Ich bin mir nicht sicher, ob dieser Unterschied beabsichtigt ist, aber es sieht nach einem Fehler aus. Da wir für dotnet core nichts in die Nachricht schreiben, enthält das resultierende XML keine Informationen und kann daher dem Benutzer nicht angezeigt werden. Auf dem Dotnet-Framework wird der Test die folgende Fehlermeldung haben Test exceeded Timeout value of 1000ms

Hey @mikkelbu ,

sorry für die fehlenden informationen. Hier ist es:

  • Vor Ort führe ich unsere Tests mit Resharper innerhalb von VS 2019 durch
  • Unser CI-Server ist TeamCity, wo wir einerseits mit dotnet test und andererseits mit Hilfe von NUKE und dotnet test die "nackten" Tests für einige Coverage-Berichte durchführen
  • Ausrichtung auf .NET Core 3.1 in allen Testprojekten

Ich sehe die gleiche Nachricht Exception doesn't have a stacktrace lokal und in TeamCity.

Ich benutze die Konsole nicht. Andere NUnit-Versionen sind:

  • NUnit v3.13.2
  • NUnit.Engine v3.12.0
  • NUnit3TestAdapter v4.0.0-beta.2

Mir ist aufgefallen, dass wir neben NUnit auch Microsoft.NET.Test.Sdk v.16.9.4 als NuGet-Paket installiert haben. Könnte dies ein Problem sein?

Vielen Dank!

Hallo @Prodigio

Danke für alle Informationen. Ich bin mir ziemlich sicher, dass die fehlenden Informationen darauf zurückzuführen sind, dass Sie auf .NET Core 3.1 abzielen und wir in nunit/nunit#3190 einen Fehler gemacht haben.

Davon abgesehen glaube ich nicht, dass wir Stacktrace aufzeichnen, wenn der Test aufgrund eines Timeouts fehlschlägt, da wir nicht wissen, wie weit wir uns im Code befinden (also wohin genau der Stacktrace zeigen soll). Die beiden Aufrufe von context.CurrentResult.SetResult oben haben ein drittes Argument, das der Stacktrace ist, aber wir füllen es nicht aus.

Aber ich denke, wir sollten den .NET Core-Flow korrigieren, also melden wir auch Test exceeded Timeout value ... als Nachricht.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen