Em um projeto em que existem requisitos não funcionais que especificam o tempo máximo de execução para uma ação específica, o controle de qualidade deve verificar o desempenho dessa ação em uma máquina dedicada, usando hardware preciso sob carga precisa, tanto o hardware quanto a carga sendo especificados nos requisitos.
Por outro lado, algumas alterações incorretas no código-fonte podem afetar seriamente o desempenho. Perceber esse impacto negativo cedo , antes que o código-fonte atinja o controle de origem e seja verificado pelo departamento de controle de qualidade, pode ser benéfico em termos de tempo perdido pelo departamento de controle de qualidade que relata o problema e pelo desenvolvedor que o corrige várias confirmações posteriormente.
Para fazer isso, é uma boa ideia:
Para usar testes de unidade para ter uma idéia do tempo gasto executando a mesma ação² n vezes,
Para usar o tempo limite por teste através do
[TestMethod, Timeout(200)]
atributo em C #?
Espero vários problemas com essa abordagem:
Conceitualmente , os testes de unidade não são realmente para isso: eles devem testar uma pequena parte de um código, nada mais: nem a verificação de um requisito funcional, nem um teste de integração, nem um teste de desempenho.
O tempo limite do teste de unidade no Visual Studio mede realmente o que se espera que seja medido, levando em consideração que a inicialização e a limpeza não existem para esses testes ou são muito curtas para afetar os resultados?
Medir o desempenho dessa maneira é feio. Executar um benchmark em qualquer máquina¹ independentemente do hardware, carga, etc. é como fazer um benchmark que mostre que um produto de banco de dados é sempre mais rápido que outro. Por outro lado, não espero que esses testes de unidade sejam um resultado definitivo, nem algo usado pelo departamento de controle de qualidade . Esses testes de unidade serão usados apenas para fornecer uma idéia geral sobre o desempenho esperado e, essencialmente, para alertar o desenvolvedor de que sua última modificação quebrou algo, afetando severamente o desempenho .
O Test Driven Development (TDD) é impossível para esses testes. Como isso falharia, em primeiro lugar, antes de começar a implementar o código?
Muitos testes de desempenho afetarão o tempo necessário para executar os testes, portanto, essa abordagem é limitada apenas a ações curtas.
Levando em conta esses problemas, ainda acho interessante usar esses testes de unidade se combinados com as métricas reais de desempenho do departamento de controle de qualidade.
Estou errado? Existem outros problemas que tornam totalmente inaceitável o uso de testes de unidade para isso?
Se eu estiver errado, qual é a maneira correta de alertar o desenvolvedor de que uma alteração no código-fonte afetou gravemente o desempenho, antes que o código-fonte alcance o controle de origem e seja verificado pelo departamento de controle de qualidade?
¹ Na verdade, espera-se que os testes de unidade sejam executados apenas em PCs desenvolvedores com desempenho de hardware comparável, o que reduz a diferença entre as máquinas mais rápidas que nunca serão capazes de falhar no teste de desempenho e as máquinas mais lentas que nunca conseguirão passar por ele.
² Por ação, quero dizer um pedaço de código bastante curto que gasta alguns milissegundos para executar.