Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Mock e Isolamento de Testes | Testes com Unittest e Pytest
Programação Estrutural em Python

Mock e Isolamento de Testes

Deslize para mostrar o menu

Mocking é uma técnica poderosa em testes unitários que permite substituir partes do seu sistema em teste por objetos mock ou funções simuladas. O objetivo é isolar a unidade de código que está sendo testada de suas dependências, como bancos de dados, APIs ou outros sistemas complexos. Ao utilizar mocks, é possível controlar o comportamento das dependências e focar em testar a lógica do seu código em um ambiente controlado.

Isolamento de testes é importante porque garante que os testes não interfiram entre si e não sejam afetados por fatores externos ao seu escopo. Testes isolados são mais confiáveis e fáceis de depurar, pois seus resultados dependem apenas do código em teste e das condições específicas que você configura, e não do estado ou comportamento de sistemas externos.

Em Python, o módulo unittest.mock fornece ferramentas para simular objetos e funções. Ao usar mocking, você pode substituir uma função ou objeto real por um mock que retorna valores controlados ou registra como foi utilizado. Isso é especialmente útil quando seu código interage com recursos que são lentos, imprevisíveis ou indisponíveis durante os testes.

12345678910111213141516171819202122232425
import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)

Neste exemplo de código, a função check_the_sky simula uma dependência externa que é instável ou está fora do ar, como uma API de clima que pode não estar sempre disponível. A função get_advice contém a lógica que se deseja testar — ela chama check_the_sky e retorna um conselho com base no resultado.

A classe de teste do unittest utiliza mocking para substituir a função real check_the_sky por um mock que retorna valores controlados. Isso permite testar como get_advice se comporta em diferentes cenários, como quando o céu está limpo ou chuvoso, sem depender do sistema externo real.

O decorador @patch é utilizado para substituir temporariamente a função real check_the_sky por um objeto mock durante cada método de teste. O objeto mock é passado para o método de teste como o parâmetro mock_check. Você utiliza mock_check para definir o valor de retorno desejado para aquele teste, permitindo controlar como seu código se comporta e o que retorna em cada cenário.

Note
Nota

A função unittest.main() nesta lição inclui alguns parâmetros extras necessários apenas para este ambiente de aprendizado. Eles ajudam o código a ser executado corretamente na plataforma e não fazem parte dos conceitos principais de Python que você precisa aprender agora.

Ao utilizar mocking, você isola seus testes de sistemas externos que podem ser lentos ou não confiáveis. Isso torna seus testes rápidos, repetíveis e determinísticos, pois você controla exatamente o que a dependência retorna em cada caso de teste.

question mark

Quando você deve usar mocking em testes unitários?

Selecione todas as respostas corretas

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 5. Capítulo 4
some-alt