Testes em Python II — datetime
Todos os testes dessa sequência de posts podem ser encontrados nesse repositório.
Algumas pessoas já me pediram ajuda para fazer testes em rotinas que utilizam tempo em geral. Quando você tem um método que usa today
e precisa fazer um teste nele, o mais comum é fazer alguma coisa como @mock.patch('datetime.date.today')
e depois ficar tentando entender o que está dando erro. Isso não funciona porque nada do Python que seja buildado em C pode ser alterado, métodos, classes, nada… Os detalhes sobre isso são assuntos para outro post.
Sabendo agora que isso não funciona nós podemos fazer um teste da seguinte forma:
import datetime
class MinhaData(datetime.date):
@classmethod
def today(cls):
return cls(1981, 06, 21)
datetime.date = MinhaData
Agora você pode fazer o teste usando o today
e terminá-lo:
datetime.date.today()
MinhaData(1981, 06, 21)
Bom, funciona, mas eu não gosto de ter que lidar com isso em todo arquivo de testes que eu faço. Por esse motivo eu quero mostrar como poderíamos fazer a mesma coisa utilizando freezegun.
Com essa biblioteca você vai conseguir "congelar" o seu datetime
com uma simples anotação. Veja o caso abaixo:
Criei um método extremamente simples responsável por montar e retornar um json. Uma das propriedades do json é um datetime.now()
.
def build_json_from_text(text):
return {
"date": datetime.now().isoformat(),
"text": text
}
Agora vamos fazer um teste nesse código.
from freezegun import freeze_time@freeze_time("1981-06-21T01:17:48.459595")
def test_build_json_from_text(self):
expected_json = {
"date": "1981-06-21T01:17:48.459595",
"text": "Hi"
}
result = build_json_from_text("Hi")
self.assertDictEqual(result, expected_json)
Com a anotação do freeze_time
nós garantimos que qualquer datetime.now()
vai retornar 1981–06–21T01:17:48.459595
.
Com o freezegun você vai congelar o datetime. Usando now()
ou today()
o resultado será a data que você congelou.
No repositório do freezegun você encontra muitos exemplos de como se utilizar essa ferramenta.
Ficou alguma dúvida? Não conseguiu resolver testar alguma rotina? Sinta-se à vontade de me procurar para a gente tentar resolver o problema.