Wersja nUnit 3.0 wspiera wykonywanie testów równolegle. Jeśli mamy testy integracyjne albo akceptacyjne, wtedy wykonywanie ich równolegle, w znaczący sposób może przyśpieszyć CI. W przypadku testów jednostkowych nie ma już to takiego znaczenia, bo i tak powinny one wykonywać się szybko.
Zaczynamy oczywiście od instalacji pakietu nuget NUnit 3. Załóżmy, że mamy następujące, czasochłonne do wykonania testy:
[TestFixture] public class Tests1 { [Test] public void Test1() { Console.WriteLine("Test 1 - start"); Thread.Sleep(1000); Console.WriteLine("Test 1 - end"); } } [TestFixture] public class Tests2 { [Test] public void Test2() { Console.WriteLine("Test 2 - start"); Thread.Sleep(1000); Console.WriteLine("Test 2 - end"); } } [TestFixture] public class Tests3 { [Test] public void Test3() { Console.WriteLine("Test 3 - start"); Thread.Sleep(1000); Console.WriteLine("Test 3 - end"); } } [TestFixture] public class Tests4 { [Test] public void Test4() { Console.WriteLine("Test 4 - start"); Thread.Sleep(1000); Console.WriteLine("Test 4 - end"); } }
Jeśli wykonamy je teraz, zostaną one odpalone w sposób sekwencyjny:
Czas wykonania to około 5 sekund, ponieważ domyślnie nie są one uruchamiane równoległe.
W Assembly.cs możemy umieścić globalny atrybut, który umożliwi ich zrównoleglenie, tzn.:
[assembly: Parallelizable(ParallelScope.Fixtures)]
Wynik:
Widzimy, że czas ich wykonania zmalał do 2 sekund.
Jeśli jakiś test chcemy wyłączyć z zrównoleglenia, wtedy wystarczy umieścić następujący atrybut:
[Parallelizable(ParallelScope.None)]
Jak widać, atrybut możemy stosować zarówno globalnie jak i selektywnie na konkretnych testach. Dobrze napisane testy nie powinny zależeć od kolejności ich wykonywania, zatem umieszczenie atrybutu Parallelizable globalnie jest rozsądnym podejściem.
Domyślna liczba wątków służąca do odpalenia testów zależy od procesora, a konkretnie liczby rdzeni. Możliwie jest jednak ręczne sterowanie liczbą wątków za pomocą następującego atrybutu:
[assembly:LevelOfParallelism(5)]
Warto również wspomnieć, że na dzień dzisiejszy nie istnieje możliwość wykonania konkretnych testów (metod) równolegle. Innymi słowy, możliwe jest zrównoleglenie wyłącznie klas (TestFixture).