QA Learning / pytest

Módulo 2: Anatomia de um teste

função test_, assert, fixture, conftest.py

O teste mínimo

def test_soma():
    assert 2 + 2 == 4
  • O pytest descobre sozinho toda função cujo nome começa com test_, em arquivos test_*.py.
  • assert <expressão>: se for verdadeira, passa; se falsa, falha. Nada de self.assertEqual; é o assert puro do Python.
  • Quando falha, o pytest reescreve o assert pra te mostrar os valores: assert 4 == 5 vira uma mensagem com o 4 e o 5 lado a lado.

Fixtures: o preparo que vem pronto

Quase todo teste precisa de um "setup": abrir conexão, criar massa, limpar no fim. Uma fixture é uma função que faz esse preparo e entrega o resultado pro teste. O teste só pede pelo nome, como parâmetro.

No projeto, a fixture db está no conftest.py:

@pytest.fixture
def db(tmp_path):
    copia = tmp_path / "pratica.db"
    shutil.copy(BANCO, copia)          # cópia: um teste não suja o outro
    con = sqlite3.connect(copia)
    con.row_factory = sqlite3.Row      # row["nome"] em vez de row[1]
    try:
        yield con                      # entrega pro teste
    finally:
        con.close()                    # roda DEPOIS do teste, sempre

Qualquer teste que escreva def test_x(db): recebe essa conexão pronta. O yield divide a fixture em "antes" e "depois": o que vem depois do yield é a limpeza. tmp_path é uma fixture do próprio pytest, uma pasta temporária só daquele teste.

conftest.py

Arquivo especial que o pytest carrega automaticamente, sem import. Serve pra fixtures e configuração compartilhadas por todos os testes da pasta (e subpastas). Você nunca escreve import conftest, só põe as fixtures lá e usa pelo nome.

Rodando um pedaço só

pytest -v                          # tudo, uma linha por teste
pytest test_01_primeiros_testes.py # um arquivo
pytest -k "orfao or email"         # só testes com esse texto no nome
pytest -x                          # para no primeiro que falhar
pytest --lf                        # só os que falharam na última rodada

No começo você vai viver do -v e do -k: rodar rápido só o teste em que está mexendo.

Exercício

Abra trilha-3/test_01_primeiros_testes.py e:

  1. Rode só ele: pytest -v test_01_primeiros_testes.py.
  2. Adicione um teste novo que confira que existem 15 produtos (dica: scalar(db, "SELECT COUNT(*) FROM produtos")).
  3. Faça ele falhar de propósito (espere 14) e leia a mensagem que o pytest imprime. Depois conserte.

Objetivo: ver o ciclo escrever → rodar → ler o vermelho → corrigir → verde com as próprias mãos.

Olhar de QA

A fixture que copia o banco antes de cada teste não é detalhe técnico, é isolamento, e isolamento é o que separa uma suíte confiável de uma que falha sozinha às terças. Teste que depende do que o teste anterior deixou vai falhar um dia, sem ninguém entender o porquê, e é assim que um time deixa de confiar no vermelho.

Terminou este módulo? Marque: o ✓ aparece no índice da trilha e a barra de progresso anda no começo do site. Fica salvo só no seu navegador.