Como fazer testes de unidade em um método que leva em consideração o tempo decorrido?


8

Atualmente, estou refatorando um método importante em um sistema legado. Houve quase zero teste até eu começar a trabalhar nele, e adicionei bastante para garantir o trabalho correto após minhas refatorações.

Agora me deparei com a parte mais crucial: o algoritmo que calcula um indicador. É algo como

indicator = (OneNumberFromA + AnotherNumberFromB) / elapsedTime;

Como posso testar o comportamento correto para esta função com testes de unidade?

Existem também alguns algoritmos ligeiramente diferentes nas funções, que o programa alcança em alguns casos - mas em todos eles, elapsedTimeé vital para o resultado.

Respostas:


11

Da mesma forma que você resolve quase todos os problemas com testes de unidade: você zomba do tempo decorrido.

Aconselho o uso de um método padronizado para obter o tempo do sistema em todo o sistema e, em seguida, tornar esse método substituível, para que seus testes de unidade tenham controle total. Os testes conterão muitas chamadas bacanas como Time.fake(timeA), ou até mesmo Time.stop().


O tempo é realmente obtido através do sistema. O método de função armazena o loginTime e calcula o tempo decorrido via DateTime.Now - loginTime. Vou tentar zombar disso. Obrigado por me apontar nessa direção.
MHR

5
Em seguida, refatorar e substituir todas as chamadas System.currentTimeMillis()por um método Time.now(), que geralmente faz o mesmo, mas em teste pode ser feito para retornar qualquer valor que você desejar. Isso pode exigir algum esforço, mas não é provável que quebre nada, pois é uma mudança muito focada e contida.
precisa

1

A medição do tempo e a avaliação do indicador devem estar em diferentes funções. No seu caso, elapsedTimedeve ser uma entrada da função de avaliação. Dessa forma, seu código de avaliação pode ser testado e é mais fácil de entender.

Agora você ainda tem o problema de testar a função de medição de tempo, mas isso está além do escopo desta pergunta.


Essa é uma das coisas para as quais eu irei, mas agora, o tempo decorrido é calculado dentro da função. Não tenho certeza se é bom extrair isso sem fazer um teste para garantir que o comportamento observável permaneça o mesmo - o que é crucial em relação à refatoração de Fowlers .
13003 mhr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.