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

Dúvida - Testes

Boa tarde!

Tenho uma dúvida. Quando rodo o mesmo teste, naturalmente que a função idade calcula que uma pessoa que nasceu em 2000, está com 23 anos e não com 22. Dentro dos conceitos de TDD, seria errado eu colocar uma fórmula que atualiza de ano em ano?

Por exemplo:

(...)
esperado = int(entrada.spit('/')[-1]) - date.today().year

Obrigado!

2 respostas
solução!

Olá, Fabio. Tudo belezinha?

Existe um problema nessa abordagem que você pensou. 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 lógica de 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!

Perfeito! Fictou claro para mim! Muito obrigado!