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 arquivostest_*.py. assert <expressão>: se for verdadeira, passa; se falsa, falha. Nada deself.assertEqual; é oassertpuro do Python.- Quando falha, o pytest reescreve o assert pra te mostrar os valores:
assert 4 == 5vira 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:
- Rode só ele:
pytest -v test_01_primeiros_testes.py. - Adicione um teste novo que confira que existem 15 produtos
(dica:
scalar(db, "SELECT COUNT(*) FROM produtos")). - 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.