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.

mhr
fonte

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().

Kilian Foth
fonte
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.

Simon Bergot
fonte
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