Skip to content
Back to skills

Framework Testing Python

ASecurity

Atua como Especialista em Testes Automatizados e Engenharia de QA em Python, cobrindo o ecossistema Pytest e o framework nativo Unittest. Domina Fixtures modulares, conftest.py, parametrização formal (BVA/Partições de Equivalência), subTests, Property-Based Testing (Hypothesis), Mocks (unittest.mock, @patch, MagicMock, pytest-mock), Testes de Mutação (mutmut), testes assíncronos (pytest-asyncio) e análise de cobertura (pytest-cov).

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
testingpythongobashexpresstestingapi

Works with

  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned September 8, 2026

npx -y skills add dandgabr/skills --skill framework-testing-python --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Framework Testing Python?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Framework Testing Python
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dandgabr-framework-testing-python/badge)](https://www.skillsdirectory.com/skills/dandgabr-framework-testing-python)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: framework-testing-python
description: "Atua como Especialista em Testes Automatizados e Engenharia de QA em Python, cobrindo o ecossistema Pytest e o framework nativo Unittest. Domina Fixtures modulares, conftest.py, parametrização formal (BVA/Partições de Equivalência), subTests, Property-Based Testing (Hypothesis), Mocks (unittest.mock, @patch, MagicMock, pytest-mock), Testes de Mutação (mutmut), testes assíncronos (pytest-asyncio) e análise de cobertura (pytest-cov)."
---

# Testes Automatizados em Python: Pytest & Unittest

Esta skill estabelece os padrões e metodologias de engenharia para desenvolvimento e automação de suítes de testes em Python, integrando o ecossistema avançado do **Pytest** e a biblioteca padrão orientada a objetos **Unittest**.

---

## 🧭 1. Comparativo e Diretrizes de Seleção de Framework

| Aspecto | Pytest | Unittest (Standard Library) |
| :--- | :--- | :--- |
| **Estilo / Paradigma** | Funcional com fixtures e asserts nativos | Orientado a Objetos derivando de `unittest.TestCase` |
| **Asserts** | `assert expressao` (com AST rewriting rico) | `self.assertEqual()`, `self.assertRaises()`, etc. |
| **Injeção / Setup** | Fixtures modulares escopadas (`function`, `module`, `session`) | Ciclo de vida estático `setUp()`, `tearDown()`, `setUpClass()` |
| **Parametrização** | `@pytest.mark.parametrize` (formal e declarativo) | `self.subTest()` dentro de laços |
| **Dependências** | Requer `pytest` (`pip install pytest`) | Zero dependências externas (embutido no Python) |
| **Casos de Uso** | Aplicações modernas, microserviços, ML, APIs, mutação | Scripts leves, bibliotecas puras sem dependências externas |

---

## ⚡ 2. Pytest: Padrões Avançados de Engenharia

### 2.1 Parametrização Formal de BVA e Tabelas de Decisão
```python
import pytest
from my_app.services import validate_withdrawal

# Domínio válido de saque: [10.0, 5000.0]
@pytest.mark.parametrize("amount, balance, is_blocked, expected_status, raises_exc", [
    # BVA: Limites da variável amount
    (9.99, 1000.0, False, None, True),          # min- (Inválido robusto)
    (10.0, 1000.0, False, "APPROVED", False),    # min
    (10.01, 1000.0, False, "APPROVED", False),   # min+
    (500.0, 1000.0, False, "APPROVED", False),   # nom
    (4999.99, 6000.0, False, "APPROVED", False), # max-
    (5000.0, 6000.0, False, "APPROVED", False),  # max
    (5000.01, 6000.0, False, None, True),        # max+ (Inválido robusto)
    # Tabela de Decisão: Condições de Saldo e Bloqueio
    (100.0, 50.0, False, "INSUFFICIENT_FUNDS", False),
    (100.0, 1000.0, True, "CARD_BLOCKED", False),
])
def test_withdrawal_bva_and_decision_rules(amount, balance, is_blocked, expected_status, raises_exc):
    if raises_exc:
        with pytest.raises(ValueError):
            validate_withdrawal(amount=amount, balance=balance, is_blocked=is_blocked)
    else:
        status = validate_withdrawal(amount=amount, balance=balance, is_blocked=is_blocked)
        assert status == expected_status
```

### 2.2 Property-Based Testing com `hypothesis`
```python
from hypothesis import given, strategies as st
from my_app.algorithms import sort_items, compress, decompress

@given(st.lists(st.integers()))
def test_sort_invariants(lst):
    result = sort_items(lst)
    assert len(result) == len(lst)
    assert all(result[i] <= result[i+1] for i in range(len(result)-1))

@given(st.binary())
def test_compress_roundtrip(data):
    assert decompress(compress(data)) == data
```

---

## 🏛️ 3. Unittest: Padrões Orientados a Objetos e Sem Dependências

### 3.1 Estrutura de TestCase e SubTests
```python
import unittest
from my_app.services import UserRegistry, validate_discount

class TestUserRegistry(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.shared_resource = {"environment": "test"}

    def setUp(self):
        self.registry = UserRegistry()
        self.registry.clear()

    def tearDown(self):
        self.registry.clear()

    def test_register_user(self):
        user = self.registry.register("alice@example.com", "Alice")
        self.assertEqual(user.email, "alice@example.com")
        self.assertTrue(self.registry.exists("alice@example.com"))

    def test_discount_scenarios_subtest(self):
        test_cases = [
            ("VIP", 100.0, 80.0),
            ("REGULAR", 100.0, 95.0),
            ("ANONYMOUS", 100.0, 100.0),
        ]
        for role, price, expected in test_cases:
            with self.subTest(role=role, price=price):
                result = validate_discount(role, price)
                self.assertAlmostEqual(result, expected, places=2)
```

---

## 🎭 4. Mocks, Spies e Isolamento de Efeitos Colaterais

### 4.1 Uso de `unittest.mock` (`@patch` e `MagicMock`)
```python
from unittest.mock import patch, MagicMock
import pytest
from my_app.gateways import PaymentProcessor

def test_payment_with_patch(mocker):
    # Usando pytest-mock ou unittest.mock nativo
    with patch("my_app.gateways.requests.post") as mock_post:
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {"status": "PAID", "tx_id": "tx-123"}
        
        processor = PaymentProcessor()
        tx = processor.charge(amount=150.0, token="card_tok_abc")
        
        mock_post.assert_called_once()
        assert tx.status == "PAID"
        assert tx.id == "tx-123"
```

---

## 🧬 5. Testes de Mutação (mutmut) e Cobertura (pytest-cov)

- **Medição de Escore de Mutação**:
  $$MS = \frac{\text{Mutantes Mortos (Killed)}}{\text{Total de Mutantes Gerados}} \times 100\%$$
- **Comandos de Execução**:
  ```bash
  # Cobertura com branch coverage
  pytest --cov=my_app --cov-branch --cov-report=html --cov-fail-under=90

  # Teste de mutação
  mutmut run --paths-to-mutate my_app/
  mutmut results
  ```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…