Use unittest.mock para Monitorar Chamadas
Nesta etapa, exploraremos como usar o módulo unittest.mock para monitorar chamadas de função. O módulo unittest.mock é uma ferramenta poderosa para testes e depuração (debugging), e fornece uma maneira conveniente de rastrear invocações de funções, argumentos e valores de retorno.
Vamos continuar com a função greet das etapas anteriores. Usaremos unittest.mock para monitorar as chamadas para greet.
Modifique o arquivo my_function.py no diretório ~/project para incluir o seguinte código:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""Esta função cumprimenta a pessoa passada como parâmetro."""
print(f"Olá, {name}!")
## Cria um objeto mock para a função greet
mock_greet = mock.Mock(wraps=greet)
## Exemplo de uso
mock_greet("Alice")
mock_greet("Bob")
## Imprime o número de vezes que a função foi chamada
print(f"A função greet foi chamada {mock_greet.call_count} vezes.")
## Imprime os argumentos com os quais a função foi chamada
print(f"As chamadas foram: {mock_greet.call_args_list}")
Neste código:
- Importamos o módulo
mock de unittest.
- Criamos um objeto
mock.Mock que envolve a função greet. O argumento wraps diz ao objeto mock para chamar a função greet original quando ela for chamada.
- Em seguida, chamamos o objeto
mock_greet em vez da função greet original.
- Finalmente, usamos os atributos
call_count e call_args_list do objeto mock para obter informações sobre as chamadas de função.
Execute o script novamente usando o mesmo comando:
python ~/project/my_function.py
Você deve ver uma saída semelhante a esta:
Olá, Alice!
Olá, Bob!
A função greet foi chamada 2 vezes.
As chamadas foram: [call('Alice'), call('Bob')]
Esta saída mostra que a função greet foi chamada duas vezes e também mostra os argumentos que foram passados para a função em cada chamada.
Agora, vamos examinar o call_args_list mais de perto. É uma lista de objetos call, cada um representando uma única chamada para a função mockada. Você pode acessar os argumentos de cada chamada usando os atributos args e kwargs do objeto call.
Por exemplo, vamos modificar o código para imprimir os argumentos da primeira chamada:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""Esta função cumprimenta a pessoa passada como parâmetro."""
print(f"Olá, {name}!")
## Cria um objeto mock para a função greet
mock_greet = mock.Mock(wraps=greet)
## Exemplo de uso
mock_greet("Alice")
mock_greet("Bob")
## Imprime o número de vezes que a função foi chamada
print(f"A função greet foi chamada {mock_greet.call_count} vezes.")
## Imprime os argumentos com os quais a função foi chamada
print(f"As chamadas foram: {mock_greet.call_args_list}")
## Imprime os argumentos da primeira chamada
if mock_greet.call_args_list:
print(f"Os argumentos da primeira chamada foram: {mock_greet.call_args_list[0].args}")
Execute o script novamente:
python ~/project/my_function.py
Você deve ver uma saída semelhante a esta:
Olá, Alice!
Olá, Bob!
A função greet foi chamada 2 vezes.
As chamadas foram: [call('Alice'), call('Bob')]
Os argumentos da primeira chamada foram: ('Alice',)
Esta saída mostra que a primeira chamada para greet foi feita com o argumento "Alice".
O módulo unittest.mock fornece uma maneira poderosa e flexível de monitorar chamadas de função em Python. É uma ferramenta valiosa para testes, depuração e análise de desempenho.