Używam xUnit z programem testującym ReSharper i xUnitContrib wtyczka resharper.
Kiedy mam długotrwały test, chciałbym móc wyświetlić jakiś wskaźnik postępu w oknie Wyjście testu jednostkowego.
Próbowałem Debug.WriteLines
, Trace.WriteLine
i Console.WriteLine
. Wszystkie zachowują się tak samo - nic nie pojawia się w oknie wyników, dopóki test się nie zakończy.
Na przykład:
[Fact]
public void Test()
{
Debug.WriteLine("A");
Trace.WriteLine("B");
Console.WriteLine("C");
Thread.Sleep(10000);
}
Test nie pokazuje wyniku, dopóki nie upłynie 10 sekund i test nie zostanie zakończony. Jak uzyskać wynik po drodze?
AKTUALIZACJA 1
Próbowałem także z MSTest i NUnit. NUnit jest jedynym, który pokazuje wyniki po drodze.
MSTest i XUnit nie zwracają żadnych danych wyjściowych, dopóki test się nie zakończy. Dziwne jest to, że podczas gdy wyniki testów XUnit i NUnit wyglądają tak:
A
B
C
Wyjście MSTest wygląda następująco:
C
Debug Trace:
A
B
Biorąc pod uwagę wszystkie te odmiany, myślę, że odpowiedźpolega na tym, że to od implementacji testera zależy, jak i kiedy wydrukować. Czy ktoś wie, czy można skonfigurować testera XUnit?
AKTUALIZACJA 2
Myślę, że to musi być niedobór xUnitContrib. Wysłano do ich Śledzenie problemów CodePlex.
Odpowiedzi:
22 dla odpowiedzi nr 1Jeśli korzystałeś z xUnit.net 1.x, być może wcześniej pisałeś dane wyjściowe do konsoli, debugowania lub śledzenia. Kiedy xUnit.net v2 jest dostarczany z równolegle włączona domyślnie ten mechanizm przechwytywania danych wyjściowych nie był już odpowiedni; nie można wiedzieć, który z wielu testy, które mogły być uruchomione równolegle, były odpowiedzialne za pisanie do tych udostępnionych zasobów. Użytkownicy przenoszący kod z wersji 1.x na Wersja 2.x powinna zamiast tego użyć jednej z dwóch nowych metod.
Spójrz tutaj, na przykład, jak wykonać rejestrowanie za pomocą xUnit.net v2:
http://xunit.github.io/docs/capturing-output.html
Oto przykład:
using Xunit;
using Xunit.Abstractions;
public class MyTestClass
{
private readonly ITestOutputHelper output;
public MyTestClass(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public void MyTest()
{
var temp = "my class!";
output.WriteLine("This is output from {0}", temp);
}
}
7 dla odpowiedzi nr 2
ReSharper w jakiś sposób usunął domyślnego detektora w testach jednostkowych. Aby wyświetlić tekst w oknie Output, wystarczy dodać ten wiersz:
Debug.Listeners.Add(new DefaultTraceListener());
6 dla odpowiedzi nr 3
Za Brad Wilson:
Jest to ograniczenie w xUnit.net, a nie adapter Resharper.
Zajmiemy się tym w v2 xUnit.net.
http://xunitcontrib.codeplex.com/workitem/4160
0 dla odpowiedzi nr 4
Najłatwiejsze, jakie znalazłem, to użyć log4net iUtwórz rejestrator konsoli. Po drodze, gdy „biegniesz”, wywołujesz logger.Info („informacje tutaj”); lub log.Debug („informacje tutaj”); - naprawdę niezależnie od preferowanego poziomu rejestrowania - a dane wyjściowe pojawią się w sesji testowej jednostki Resharper.
Przeczytaj więcej o frameworku log4net na stronie głównej Apache log4net. The przykłady konfiguracji będzie również nieoceniony.