Usando NBench para testes de performance

26 set

Fala galera,

Hoje venho trazendo uma nova ferramenta que pode nos ajudar a medir a performance da nossa aplicação ao longo do tempo. Essa ferramenta é o NBench.

NBench é um framework de teste de desempenho no qual podemos medir o desempenho de um determinado método e assim garantir que qualquer refatoração ao longo do tempo aponte para possíveis problemas de desempenho

Então, o que queremos fazer é escrever algum teste de unidade baseado em uma diretriz de desempenho em torno de um método e apontar se o método está lento ou se um método crítico onde o desempenho deve ter um determinado nível, ou seja, o método deve ser completo em menos do que x ms.

NBench é muito mais do que apenas um cronômetro / temporizador.  Nele podemos comparar o uso da memória, o GC e outros contadores.

Vamos ao exemplo

Nosso cenário é criar um teste de desempenho clássico, ou seja, testar o como é rápido um método. Então, vamos escrever um código e assim analisa-lo com o NBench e ver como as coisas se encaixam. Para isso vamos criar:

  • Um projeto de Class Library
  • Adicionar o Pacote do NBench (install-package nbench)
  • Adicionar o Runner do NBench (install-package nbench.runner)

Vamos criar uma simples classe que adiciona um objeto no cache

 public class WebCache<T>
 {
    private readonly List<T> cache = new List<T>();

    public void Add(T item)
    {
        if (!Contains(item))
            cache.Add(item);
    }

    public bool Contains(T item)
    {
        return cache.Contains(item);
    }
}

Agora vamos escrever nosso teste com o NBench

public class WebCacheTest
   {
       WebCache<String> Cache { get; set; } = new WebCache<string>();
       
       [PerfBenchmark(NumberOfIterations = 1, RunMode = RunMode.Throughput, TestMode = TestMode.Test,  SkipWarmups = true)]
       [ElapsedTimeAssertion(MaxTimeMilliseconds = 2000)]
       public void WebCahe_Performance_Tests()
       {
           for (int i = 0; i < 100_000; i++)
           {
               Cache.Add(i.ToString());
           }
       }
   }

Para testar, devemos executar o Nbench.Runner, conforme figura abaixo. Eu estou usando o cmder mas fique a vontade para usar o prompt de sua preferência.

Como podemos ver, nosso teste passou e o NBench traz todas as informações em uma pagina de resultado. Tudo isso configurável conforme as suas necessidades.

O NBench traz uma lista de assertions no qual podemos utilizar para medir a performance.

  • MemoryAssertionAttribute – baseado na memória alocada
  • GcTotalAssertionAttribute – baseado no Garbage Collector (GC)
  • ElapsedTimeAssertionAttribute – baseado no total de tempo que um método executa
  • CounterTotalAssertionAttribute – baseado em um contador
  • GcThroughputAssertionAttribute – baseado na média de throughput do Garbage Collector (GC)
  • PerformanceCounterTotalAssertionAttribute – baseado na média de contadores de performance

Também podemos integrar o NBench em um Build Server, assim podemos executar os testes de performance e ter os resultados em tempo real.

Para saber mais sobre o NBench, clique aqui e veja a sua documentação

Abs e até a próxima.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *