Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 18.1 — Testes Unitários com Pytest e Asserções Nativas (assert)

Contexto: Testes Unitários com Pytest e Asserções Nativas (assert) no contexto de Arquitetura em Camadas, Testes com Pytest e Auditoria.

Requisitos de Execução:

  1. Criar suite de testes validando regras de negócio financeiras.

Resultado Esperado

Testes unitários executados e aprovados via Pytest.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_1_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Arquitetura em Camadas, Testes com Pytest e Auditoria
🔑 Gabarito de Código & Solução Comentada
def calcular_juros(valor: float, taxa: float) -> float:
    if taxa < 0:
        raise ValueError("Taxa invalida")
    return valor * taxa

def test_calcular_juros() -> None:
    assert calcular_juros(100.0, 0.05) == 5.0

test_calcular_juros()
print("Teste unitario basico aprovado!")

🔍 Nível 2: Prática

Problema 18.2 — Fixtures do Pytest (@pytest.fixture) para Injeção de Dependências

Contexto: Fixtures do Pytest (@pytest.fixture) para Injeção de Dependências no contexto de Arquitetura em Camadas, Testes com Pytest e Auditoria.

Requisitos de Execução:

  1. Criar fixture geradora de conexão com banco de dados de teste com teardown automático.

Resultado Esperado

Fixture do Pytest injetando estado isolado para cada caso de teste.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_2_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Arquitetura em Camadas, Testes com Pytest e Auditoria
🔑 Gabarito de Código & Solução Comentada
import sqlite3
from typing import Generator

def fixture_banco() -> Generator[sqlite3.Connection, None, None]:
    conn = sqlite3.connect(":memory:")
    yield conn
    conn.close()

for c in fixture_banco():
    print("Conexao de teste criada e isolada:", c)

⚡ Nível 3: Integração

Problema 18.3 — Testes Parametrizados com @pytest.mark.parametrize

Contexto: Testes Parametrizados com @pytest.mark.parametrize no contexto de Arquitetura em Camadas, Testes com Pytest e Auditoria.

Requisitos de Execução:

  1. Testar múltiplos casos de borda em único método de teste.

Resultado Esperado

Matriz de testes parametrizados validando entradas e saídas esperadas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_3_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Arquitetura em Camadas, Testes com Pytest e Auditoria
🔑 Gabarito de Código & Solução Comentada
casos_teste = [
    (10, True),
    (7, False),
    (0, True),
    (-2, True)
]

for num, esperado in casos_teste:
    assert (num % 2 == 0) == esperado
print("Todos os cenarios parametrizados foram aprovados!")

🏆 Nível 4: Desafio Corporativo

Problema 18.4 — Mocking com unittest.mock (patch e MagicMock)

Contexto: Mocking com unittest.mock (patch e MagicMock) no contexto de Arquitetura em Camadas, Testes com Pytest e Auditoria.

Requisitos de Execução:

  1. Isolar chamada de API externa em teste unitário utilizando mock.patch.

Resultado Esperado

Dependência externa mockada permitindo teste 100% determinístico e offline.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_4_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Arquitetura em Camadas, Testes com Pytest e Auditoria
🔑 Gabarito de Código & Solução Comentada
from unittest.mock import MagicMock

servico_email = MagicMock()
servico_email.enviar.return_value = True

assert servico_email.enviar("teste@empresa.com") is True
servico_email.enviar.assert_called_once_with("teste@empresa.com")
print("Mock corporativo validado com sucesso!")