Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Quebra do test_quando_idade_recebe_13_03_2000_deve_retornar_22(self) no ano seguinte.

Acho que estou pegando a lógica dos testes, mas me parece que no ano seguinte este teste irá quebrar, uma vez estaremos comparando a idade vinda do método que chamamos com o esperado = 22.

Qual seria a melhor solução para deixar esses teste mais dinâmico? Pensei em algo como esperado = date.today().year - 2000, porém não sei se seria uma boa prática.

Obrigado

2 respostas
solução!

Olá. Tudo bem?

Agradeço pela paciência em aguardar um retorno aqui no fórum.

O teste realmente quebrará no próximo ano se for escrito dessa maneira.

Na solução que você pensou, o teste passaria, mas existe um problema nessa abordagem. No projeto, o método que calcula a idade, utiliza a mesma lógica desse trecho de código que você sugeriu. E não devemos testar um método repetindo a sua implementação. Desse modo, não seria uma boa prática escrever o teste assim.

Uma forma de solucionar isso pode ser utilizando a biblioteca freezegun do Python. Essa biblioteca nos permite "congelar" o tempo, assim quando executarmos o nosso teste, ele utilizará a data que especificarmos.

Para instalar o freezegun basta usar o comando:

pip install freezegun

Desse modo, no teste podemos definir a data que desejarmos, e toda vez que o código de teste for executado, ele vai considerar para aquele teste em específico a data que definimos e não a data atual de fato.

Podemos implementar isso de duas maneiras. Primeiramente, devemos importar a biblioteca:

from freezegun import freeze_time

A primeira forma é por meio do decorator @freeze_time do freezegun, que pode ser utilizado em classes ou métodos. O teste ficaria da seguinte maneira:

@freeze_time("2022-12-08")
def test_quando_idade_recebe_13_03_2000_deve_retornar_22(self):
    entrada = '13/03/2000'
    esperado = 22

    funcionario_test = Funcionario('Teste', entrada, 1111)
    resultado = funcionario_test.idade()

    assert resultado == esperado

Outra forma é por meio da cláusula with dentro de um método, para utilizar uma data específica em alguma asserção. O teste ficaria assim:

def test_quando_idade_recebe_13_03_2000_deve_retornar_22(self):
    entrada = '13/03/2000' 
    esperado = 22

    funcionario_test = Funcionario('Teste', entrada, 1111)
    resultado = funcionario_test.idade()

    with freeze_time("2022-12-08"):
        assert resultado == esperado

Assim, quando o teste é executado, ele considera a data definida pelo freeze_time e não a data atual. Desse modo, utilizar esse recurso para especificar a data com alguma data do ano atual, fará com que mesmo com o passar dos anos, o teste continue funcionando.

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Simplesmente fantástica a explicação e sugestão oferecida, muito obrigado