Eu tenho uma classe que visa gerar uma senha aleatória de um comprimento que também é aleatório, mas limitada a estar entre um comprimento mínimo e máximo definido.
Estou construindo testes de unidade e me deparei com um pequeno problema interessante com essa classe. A idéia por trás de um teste de unidade é que ele deve ser repetível. Se você executar o teste cem vezes, ele deverá fornecer os mesmos resultados cem vezes. Se você estiver dependendo de algum recurso que pode ou não estar lá ou que esteja ou não no estado inicial que você espera, deverá zombar do recurso em questão para garantir que seu teste seja sempre sempre repetível.
Mas e nos casos em que o SUT deve gerar uma saída indeterminada?
Se eu fixar o comprimento mínimo e máximo no mesmo valor, posso verificar facilmente se a senha gerada tem o comprimento esperado. Mas se eu especificar um intervalo de comprimentos aceitáveis (digamos 15 - 20 caracteres), agora você terá o problema de poder executar o teste centenas de vezes e obter 100 passes, mas na 101ª execução, poderá recuperar uma sequência de 9 caracteres.
No caso da classe de senha, que é bastante simples em sua essência, ela não deve ser um grande problema. Mas isso me fez pensar no caso geral. Qual é a estratégia geralmente aceita como a melhor a ser adotada ao lidar com SUTs que estão gerando resultados indeterminados por design?