2011-06-21 12 views
25

Mam kilka zestawów testów integracji zaimplementowanych w C#/NUNit. Każdy zestaw testów jest osobną klasą, każda konfiguracja urządzenia tworzy i zapełnia bazę danych SQL Server ze skryptów. Wszystko to działało dobrze przed Resharperem 5.1.Jak uruchomić serię testów NUnit?

Niestety, Resharper 5.1 uruchamia kilka urządzeń naraz. To jest przełomowa zmiana - wszyscy oni próbują stworzyć i wypełnić tę samą bazę danych, co oczywiście kończy się bałaganem. Czy jest jakiś sposób, aby Resharper mógł uruchomić serię testów?

Jeśli nie, to co sugerowałbyś, aby uruchomić moje testowe urządzenia NUnit seryjnie, po jednym urządzeniu naraz? Kolejność przeprowadzania poszczególnych testów nie ma znaczenia.

+2

Czy oznacza seryjnie? Kolejno sugeruje, że kolejność, w której test jest uruchamiany, ma znaczenie. Serial oznacza po prostu, że są one uruchamiane pojedynczo, ale kolejność nie ma znaczenia. – Davy8

+0

@ Davy8: Tak, serio, poprawiłem pytanie, dzięki! –

Odpowiedz

22

Nie wiem, czy to możliwe, aby zapobiec ReSharper uruchamianie testów równolegle ; jeśli nie, może zadziałać następujący hack: Utwórz statyczną klasę ze statycznym członkiem tylko do odczytu Monitor. Następnie, w [TestFixtureSetUp], zadzwoń pod numer Enter() na monitorze i zadzwoń pod numer Exit() na monitorze pod numerem [TestFixtureTearDown]. W ten sposób będzie można uruchomić tylko jedno urządzenie testowe na raz. Nie jest to ładne, ale ...

+2

Zrobiłem to i zadziałało. –

0

O ile testowany kod nie obejmuje własnego zarządzania transakcjami, każdy test można uruchomić w ramach transakcji. W ten sposób różne testy nie będą się wzajemnie zakłócać. Nie musisz też martwić się czyszczenie po każdym teście, ponieważ transakcja każdego testu może po prostu przerwać po zakończeniu testu.

W naszych projektach, zwykle niech nasze testy integracyjne wywodzą się z klasy, który wygląda mniej więcej tak:

public class TransactionalTestFixture 
{ 
    private TransactionScope TxScope; 

    [SetUp] 
    public void TransactionalTestFixtureSetUp() 
    { 
     TxScope = new TransactionScope(TransactionScopeOption.RequiresNew, 
             new TransactionOptions {IsolationLevel = IsolationLevel.Serializable}); 
    } 

    [TearDown] 
    public void TransactionalTestFixtureTearDown() 
    { 
     TxScope.Dispose(); 
    } 
} 
+0

To nie zadziała - to są testy, a nie pojedyncze testy. Każdy tworzy nową bazę danych od zera. –

+0

@AlexKuznetsov: Ah; Widzę teraz, że nie przeczytałem wystarczająco dobrze pierwszego akapitu. –

+1

Co, jeśli zamiast tego użyłeś '[TestFixtureSetUp]' i '[TestFixtureTeardown]'? –

0

Podaj im nazwy alfabetyczne, tj. Poprzedz je literą oznaczającą ich kolejność wykonywania. Jeśli chcesz, aby tak się stało, powinieneś również zaakceptować tę paskudną konwencję nazewniczą.

+0

Oczywiście możesz sprawdzić refaktoryzację swoich testów, aby móc uruchomić z własną instancją sqlite na urządzenie, co może trochę potrwać, ale jest trochę bardziej uczciwe. –

+0

Czy Resharper gwarantuje, że zawsze będzie przeprowadzać testy w kolejności alfabetycznej? 4.1 tego nie robił - uruchamiał je w kolejności od góry do dołu. 5.1 zamawia je alfabetycznie. –

+0

@Alex: Próbowałem go wczoraj i uruchamia moje testowe urządzenia jeden po drugim w kolejności alfabetycznej. Zawsze wolelibyśmy nie polegać na tym, aby testy zadziałały, ponieważ każdy test powinien być samodzielny lub nie jest tak naprawdę jednostką. Nie mogłem znaleźć żadnego ustawienia, aby testy były wykonywane równolegle, ale nie mam wcześniejszych wersji. –

1

Jesteś tego pewien? Właśnie wypróbowałem to przez umieszczenie śladu następującej formy w testach w 3 różnych urządzeniach NUnit, a następnie "Uruchom wszystko". Wygląda na to, że nie działa równolegle.

Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Start"); 
Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Done"); 

Wyjście widzę to: (R # Budowanie 5.1.1753.1)

01:06:41.6639IOC 
01:06:41.6649Done - IOC 

01:06:41.6679VC:Start 
01:06:41.6729VC:Done 

01:06:41.2439Mef 
01:06:41.6589Mef-Done 
Powiązane problemy