Programování

Jak psát testy výkonu pomocí NBench

Při práci s aplikacemi budete často chtít znát přidělení paměti, režii uvolňování paměti (GC) a propustnost kódu. Vaše aplikace může být pomalá nebo může vyžadovat spoustu zdrojů a vy byste chtěli zjistit, co se děje.

I když můžete detekovat funkční problémy a defekty kódu pomocí testů jednotek a recenzí kódu, možná budete potřebovat způsob, jak izolovat problémy s výkonem. Tady přijde vhod NBench. Tento článek představuje diskuzi o NBench a o tom, jak jej můžeme použít k psaní testů výkonu pro aplikace .NET.

Co je NBench? Proč bych to měl používat?

NBench je populární rámec testování výkonu, který lze použít k profilování výkonu metod v naší aplikaci. NBench může měřit propustnost kódu vaší aplikace, alokaci paměti a režii GC zapojenou do získávání paměti vyčištěním nežádoucích objektů.

NBench můžete využít k „jednotkovému testu“ výkonu vaší aplikace stejným způsobem, jako píšete jednotkové testy pomocí rámců XUnit nebo NUnit. Na NBench se mi nejvíc líbí to, že jej lze integrovat do vašeho kanálu sestavení. A přestože má NBench vlastní běžec, stále můžete spustit NBench pomocí NUnit nebo Resharper. Připadá mi to jako běh vašich testů jednotek.

NBench je distribuován jako balíček NuGet. Za předpokladu, že Visual Studio je ve vašem systému již nainstalovaný, můžete NBench nainstalovat pomocí správce balíčků NuGet nebo pomocí následujícího příkazu v konzole správce balíčků.

Instalační balíček NBench

Měli byste také nainstalovat balíček NBench.Runner, který slouží ke spuštění vašeho benchmarku. Můžete to udělat také prostřednictvím NuGet, nebo provést následující příkaz z konzoly správce balíčků.

Instalační balíček NBench.Runner

Pokud jste jako já, budete chtít spustit své testy výkonu NBench pomocí NUnit. Můžete se také podívat na použití Pro.NBench.xUnit. Pro.NBench.xUnit umožňuje objevovat, spouštět nebo ladit testy NBench pomocí xUnit v ReSharper.

Psaní testů výkonu pomocí NBench

Pojďme prozkoumat, jak můžeme psát a provádět testy výkonu pomocí NBench. Vytvořte nový projekt knihovny tříd a uložte jej s užitečným názvem. Dále přidejte balíčky NBench a NBench.Runner, které jsem zmínil výše. Tady je začátek naší metody testování výkonu NBench.

[PerfBenchmark (NumberOfIterations = 1, RunMode = RunMode.Throughput,

TestMode = TestMode.Test, SkipWarmups = true)]

[ElapsedTimeAssertion (MaxTimeMilliseconds = 5000)]

public void Benchmark_Performance_ElaspedTime ()

{

// Sem napište svůj kód, který chcete porovnat

}

Všimněte si, že protože porovnáváme výkon, musíme naši metodu označit pomocí PerfBenchmark atribut. Tento atribut řekne běžci, co má dělat s touto metodou. Musíme také zahrnout jeden nebo více atributů měření. Protože testujeme rychlost provádění, používáme ElapsedTimeAssertion atribut k určení času, do kterého by se metoda měla dokončit. Existuje mnoho dalších atributů tvrzení, které můžete využít. Mezi podporovaná tvrzení v NBench patří:

  • MemoryAssertionAttribute
  • GcTotalAssertionAttribute
  • ElapsedTimeAssertionAttribute
  • CounterTotalAssertionAttribute
  • GcThroughputAssertionAttribute
  • CounterThroughputAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute

Následující metoda ukazuje, jak můžeme srovnávat výkon garbage collectoru. The Benchmark_Performance_GC metoda nám dává maximální, minimální, průměrnou a standardní odchylku kolekcí, ke kterým dochází pro každou ze tří generací GC (generace 0, 1 a 2).

[PerfBenchmark (RunMode = RunMode.Iterations, TestMode = TestMode.Measurement)]

[GcMeasurement (GcMetric.TotalCollections, GcGeneration.AllGc)]

public void Benchmark_Performance_GC ()

{

// Sem napište svůj kód, který chcete porovnat

}

Chcete-li srovnávat výkon na základě spotřeby paměti, můžete použít testovací metodu.

[PerfBenchmark (popis,

NumberOfIterations = 5, RunMode = RunMode.Throughput, RunTimeMilliseconds = 2500, TestMode = TestMode.Test)]

[MemoryAssertion (MemoryMetric.TotalBytesAllocated, MustBe.LessThanOrEqualTo, ByteConstants.SixtyFourKb)]

public void Benchmark_Performance_Memory ()

{

// Sem napište svůj kód, který chcete porovnat

}

The MemoryAssertion Atribut lze použít k určení, že chcete omezit testovanou metodu tak, aby při každém spuštění srovnávacího testu nespotřebovala více než zadané množství paměti. Například pokud výše uvedená metoda spotřebuje více než 64 kB paměti, považuje se test za neúspěšný.

Všimněte si, že v každém z příkladů kódu, které jsem ukázal výše, jsem přeskočil kód, který má být srovnáván. Porovnávání metod vaší aplikace je jednoduchá věc vložení vašeho kódu do srovnávacích metod, kde jsem uvedl.

NBench jako open-source, multiplatformní, automatizovaný rámec pro profilování výkonu pro aplikace .NET, umožňuje výkonové a zátěžové testování téměř stejně snadné jako psaní a provádění testů jednotek. NBench můžete snadno integrovat s rámci testování jednotek, jako je NUnit. Můžete dokonce integrovat NBench s xUnit a spouštět testy v ReSharper nebo v Průzkumníku testů Visual Studio. Další informace o NBench najdete na GitHubu a na webu Petabridge.