Tutorial Pytest para iniciantes: luminárias, parametrização e exemplos reais

  1. Início
  2. Blog
  3. Automação de testes

Automação de Teste

Tutorial Pytest para iniciantes: Acessórios, parametrizações e exemplos reais

Pytest permite escrever testes Python com funções simples e instruções de afirmação simples. Crie um pequeno conjunto de testes passo a passo, leia resultados de falhas reais e aprenda os recursos que você usará todos os dias.

10 min de leitura
Tutorial Pytest para iniciantes: fixtures, parametrização e exemplos reais

Principais pontos

  • Pytest encontra funções chamadas test_* e as verifica com instruções simples assert.
  • Fixtures fornecem configuração e limpeza reutilizáveis, solicitadas simplesmente nomeando-os como argumentos.
  • @pytest.mark.parametrize executa um teste com muitas entradas.
  • Coloque fixtures compartilhados em conftest.py e você não precisará importá-los.

Se você evitou escrever testes porque eles pareciam uma tarefa árdua, este tutorial do pytest deve fazer você mudar de ideia. Pytest remove a maior parte da cerimônia: não há classes das quais herdar e nenhum método de afirmação especial para lembrar. Um teste pode ter apenas duas linhas.

Construiremos um pequeno carrinho de compras e o testaremos passo a passo. Executamos tudo no Python 3.13 com pytest 9.2, e a saída mostrada é real, embora tenhamos cortado os caminhos dos arquivos e os detalhes de tempo que serão diferentes em sua máquina.

Por que pytest?

Python vem com unittest, o que funciona bem, mas pytest geralmente é a escolha mais conveniente. Aqui está a mesma verificação em cada um:

Tarefa teste unitário pytest
Verifique a igualdade self.assertEqual(a, b) afirmar a == b
Verifique uma exceção self.assertRaises(...) pytest.raises(...)
Estrutura de teste Uma classe que herda de TestCase Uma função simples
Configuração e limpeza setUp e tearDown métodos Luminárias reutilizáveis
Muitas entradas subTest laços parametrizar

Pytest também pode executar seus testes unittest existentes, para que você possa mudar gradualmente. Ele também possui um grande ecossistema de plugins, incluindo pytest-cov para cobertura e pytest-xdist para execuções paralelas.

Instale o pytest

Crie um ambiente virtual primeiro, conforme explicado em nosso tutorial de ambiente virtual Python, e depois instale-o:

pip install pytest
pytest --version

# pytest 9.2.0

Crie uma pasta de projeto contendo dois arquivos, cart.py e test_cart.py. O Pytest encontra testes automaticamente seguindo regras de nomenclatura: arquivos nomeados test_*.py ou *_test.py, funções começando com test e classes começando com Test. Se um teste não estiver sendo selecionado, uma incompatibilidade de nomenclatura é a primeira coisa a verificar.

O código para testar

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

Seus primeiros testes

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

Esse é um teste completo. Execute pytest na pasta do projeto e ele relatará um teste aprovado. Se você receber um erro de importação, execute-o como python -m pytest, que adiciona a pasta atual ao caminho de importação.

Falhas de leitura

É aqui que o pytest realmente brilha. Aqui está um teste com um valor esperado deliberadamente errado:

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

E foi isso que foi impresso quando o executamos:

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

O > marca a linha com falha e as linhas E mostram os valores reais. Você não precisou adicionar uma mensagem personalizada, porque o pytest reescreve as instruções assert para que possam relatar o que compararam. Faz o mesmo com listas e dicionários, apontando exatamente quais itens diferem.

Testando exceções

O tratamento de erros também é um comportamento e merece testes. pytest.raises passa apenas se o bloco gerar a exceção esperada:

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

O argumento opcional match verifica a mensagem usando uma expressão regular, portanto um ValueError diferente não passará por acidente. Para saber como gerar e tratar erros como este, leia nosso guia sobre tratamento de exceções em Python.

Luminárias: configuração reutilizável

A maioria dos testes precisa de algo preparado primeiro. Um fixture é uma função que fornece isso. Decore-o com @pytest.fixture, e qualquer teste que o nomeie como argumento receberá o resultado:

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Cada teste recebe um carrinho novo por padrão, portanto, os testes não podem afetar uns aos outros. Pytest combina o nome do argumento com o nome do aparelho, e você nunca chama o aparelho sozinho. @pytest.fixture é um decorador, que explicamos em Decoradores Python explicados.

Limpeza com rendimento

Use yield em vez de return quando precisar limpar depois. O código após yield é executado quando o teste termina, mesmo que tenha falhado:

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

A execução com -s para mostrar a saída impressa confirmou que o pedido foi aberto, testado e fechado.

Escopo de fixação e conftest.py

Por padrão, um fixture é executado uma vez por teste. Para configurações caras, como banco de dados ou navegador, altere seu tempo de vida com scope:

Escopo Criado uma vez por
function (padrão) Teste
aula Aula de teste
módulo Arquivo
pacote Pacote
sessão Teste completo

Coloque os fixtures usados por vários arquivos em um arquivo chamado conftest.py. O Pytest o carrega automaticamente, para que os testes possam usar seus fixtures sem importação. Porém, tenha cuidado com escopos compartilhados, pois uma alteração feita por um teste pode vazar para o próximo.

Parametrizar: um teste, muitas entradas

Em vez de copiar um teste para cada valor, liste os casos:

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Cada linha se torna seu próprio teste, e você pode ver isso na saída detalhada da execução do arquivo completo:

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Se uma linha falhar, as outras ainda serão executadas e o nome informará exatamente quais valores causaram o problema. Observe que combinamos parametrize com o fixture cart. Para escolher valores com probabilidade de encontrar bugs, use a análise de valor limite.

Dica: Quando seus parâmetros forem longos ou pouco claros, passe ids=["none", "ten", "full"] para dar a cada caso um nome legível no relatório.

Acessórios integrados úteis

Pytest inclui vários acessórios prontos. Esses dois são especialmente úteis e ambos foram aprovados em nossa corrida:

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path fornece a cada teste uma pasta temporária exclusiva, para que os testes nunca toquem em arquivos reais. monkeypatch altera variáveis ​​​​ou atributos de ambiente e desfaz a alteração quando o teste termina. Outro útil é capsys, que captura a saída impressa para que você possa verificá-la.

Marcadores: pular e xfail

Os marcadores adicionam rótulos e comportamento aos testes:

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip não executa o teste. xfail o executa, mas espera falha, portanto, um problema conhecido não interrompe sua compilação. Com os outros testes extras no mesmo arquivo, nossa execução foi resumida como 3 passed, 1 skipped, 1 xfailed. A propósito, esse teste de arredondamento realmente falha: na aritmética de ponto flutuante, 0,1 + 0,2 não é exatamente 0,3. Use pytest.approx(0.3) ao comparar decimais.

Você também pode criar seus próprios marcadores, como @pytest.mark.slow, e executá-los apenas com pytest -m slow ou deixá-los de fora com -m "not slow". Registre marcadores personalizados em seu arquivo de configuração para evitar avisos.

Sinalizadores de linha de comando úteis

Comando O que isso faz
pytest -v Mostrar o nome de cada teste
pytest -q Mostrar um resumo mais curto
pytest -x Pare na primeira falha
pytest -k desconto Execute testes cujos nomes correspondam a uma palavra
pytest -s Mostrar print saída
pytest --lf Execute novamente apenas as últimas falhas
pytest --pdb Abra o depurador com falha
pytest test_cart.py::test_total Execute um teste específico

Executando pytest em CI

Os testes são mais valiosos quando são executados automaticamente a cada alteração. Um trabalho mínimo do GitHub Actions é assim:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest sai com um código diferente de zero quando os testes falham, o que faz o pipeline parar. Não executamos este arquivo de fluxo de trabalho, então adapte-o ao seu projeto. Nosso guia de CI/CD de ações do GitHub explica os detalhes. Pytest também funciona bem para testes de navegador, como mostram nosso tutorial Selenium Python e tutorial de modelo de objeto de página.

Considerações finais

Agora você tem o que precisa para a maioria dos conjuntos de testes Python: declarações simples, acessórios para configuração, parametrização para variações e alguns sinalizadores para velocidade. Comece pequeno. Escolha uma função na qual você corrigiu recentemente um bug e primeiro escreva um teste para esse bug. Se você não tiver certeza do que testar em cada nível, leia sobre teste de unidade versus teste de integração.

Perguntas frequentes

Para que é usado o pytest?

Pytest é uma estrutura de teste Python. Ele é usado para testes de unidade, integração e API, e também funciona bem com ferramentas de navegador como Selenium e Playwright.

O pytest é melhor que o unittest?

Muitas equipes o preferem por sua sintaxe mais simples, acessórios e falhas mais claras. unittest não precisa de instalação e o pytest também pode executar testes unittest existentes.

O que é um acessório no pytest?

Um fixture é uma função que prepara algo que um teste precisa, como dados ou uma conexão. Os testes o recebem nomeando-o como um argumento.

O que é conftest.py?

É um arquivo especial para compartilhar fixtures e hooks entre arquivos de teste. O Pytest o carrega automaticamente, portanto seus fixtures não precisam de instrução de importação.

Por que o pytest não encontra meus testes?

Geralmente é um problema de nomenclatura. Os arquivos devem ser nomeados test_*.py ou *_test.py e as funções devem começar com test. Verifique também se você o executou na pasta correta.

Continue aprendendo

Trabalhe com Stack Quora

Precisa de ajuda com testes, WordPress ou SEO?

Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las

Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…

Leia o artigo →
DevOps

Variáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos

Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…

Leia o artigo →
Desenvolvimento de software

Explicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429

Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…

Leia o artigo →
Automação de testes

Zombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem

Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…

Leia o artigo →
Teste de software

Cobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa

Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…

Leia o artigo →
Bancos de dados e SQL

DELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um

DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…

Leia o artigo →
Bancos de dados e SQL

Exibições SQL explicadas: crie, use e evite as armadilhas, com exemplos

Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…

Leia o artigo →
Desenvolvimento de software

Interface TypeScript vs tipo: diferenças reais, testadas com o compilador

Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…

Leia o artigo →
Desenvolvimento de software

Python *args e **kwargs explicados: funções flexíveis com exemplos claros

Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…

Leia o artigo →
Desenvolvimento de software

Funções Python Lambda: sintaxe, usos reais e quando não usá-los

Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …

Leia o artigo →
Inteligência artificial

O que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar

O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …

Leia o artigo →
DevOps

Monitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos

Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…

Leia o artigo →
DevOps

Docker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa

Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…

Leia o artigo →
Automação de testes

TDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um

TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…

Leia o artigo →
Teste de software

Teste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais

Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…

Leia o artigo →
Bancos de dados e SQL

Valores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas

Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…

Leia o artigo →
Bancos de dados e SQL

Instrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns

SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…

Leia o artigo →
Desenvolvimento de software

O que é JWT? JSON Web Tokens explicados com um exemplo prático

O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…

Leia o artigo →
Desenvolvimento de software

Loop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos

O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…

Leia o artigo →
Desenvolvimento de software

Geradores Python e rendimento explicado: economize memória com exemplos reais

Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…

Leia o artigo →
Inteligência artificial

O que são incorporações? Similaridade de vetores e cossenos explicada de forma simples

O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…

Leia o artigo →
DevOps

Implantação azul-verde vs canário: diferenças, compensações e como escolher

Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…

Leia o artigo →
Automação de testes

Testes instáveis: o que os causa e como corrigi-los para sempre

Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…

Leia o artigo →
Teste de software

Teste de carga versus teste de estresse: diferenças, métricas e exemplos k6

Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…

Leia o artigo →
Teste de software

Caso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um

Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…

Leia o artigo →
Bancos de dados e SQL

Otimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos

Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…

Leia o artigo →
Bancos de dados e SQL

SQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado

SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…

Leia o artigo →
Desenvolvimento de software

Tutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite

Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …

Leia o artigo →
Desenvolvimento de software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…

Leia o artigo →
Desenvolvimento de software

Classes e objetos Python: tutorial OOP com exemplos reais

Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…

Leia o artigo →
Inteligência artificial

O que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros

O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…

Leia o artigo →
DevOps

Comandos Linux para iniciantes: o guia essencial do terminal com exemplos

Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …

Leia o artigo →
Automação de testes

Selenium vs Playwright: principais diferenças, código comparado e qual escolher

Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …

Leia o artigo →
Teste de software

Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…

Leia o artigo →
Teste de software

Gravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais

Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…

Leia o artigo →
Bancos de dados e SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos

Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…

Leia o artigo →
Bancos de dados e SQL

Transações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento

Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …

Leia o artigo →
Desenvolvimento de software

Folha de dicas dos comandos do Git: os comandos que você realmente usa, com exemplos

Uma folha de dicas de comandos Git agrupada por tarefa: configuração, preparação, ramificações, controles remotos, stash, histórico e desfazer erros…

Leia o artigo →
Desenvolvimento de software

Explicação das promessas de JavaScript: então, catch, Promise.all e erros comuns

Promessas JavaScript explicadas com o código que executamos: estados, cadeias then e catch, tratamento de erros, Promise.all, allSettled, race e any…

Leia o artigo →
Desenvolvimento de software

Tutorial do dicionário Python: métodos, exemplos e padrões comuns

Um tutorial de dicionário Python com código que executamos: criar, ler e atualizar dictos, métodos-chave, mesclagem, compreensão, padrões de contage…

Leia o artigo →
Inteligência artificial

O que é RAG? Geração aumentada de recuperação explicada com um exemplo prático

O que é RAG? Geração aumentada de recuperação explicada passo a passo: indexação, chunking, embeddings, recuperação, um pequeno exemplo funcional de…

Leia o artigo →
DevOps

Tutorial Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos

Um tutorial do Terraform para iniciantes: comece sem conta na nuvem, aprenda como iniciar, planejar e aplicar, depois variáveis, saídas, estado, mód…

Leia o artigo →
DevOps

Docker vs Kubernetes: principais diferenças, como eles funcionam juntos e o que você precisa

Docker vs Kubernetes explicado: o que cada um faz, o mesmo aplicativo rodando com ambos, Docker Compose e Swarm comparados, a mudança do dockershim …

Leia o artigo →
Automação de testes

Tutorial Pytest para iniciantes: luminárias, parametrização e exemplos reais

Um tutorial pytest para iniciantes com testes que executamos no pytest 9.2: asserções, fixtures, parametrizar, conftest, marcadores, tmp_path, monke…

Leia o artigo →
Teste de software

Ciclo de vida de teste de software (STLC): 6 fases, critérios de entrada e saída, exemplo

O ciclo de vida de teste de software explicou: seis fases do STLC com critérios de entrada e saída, resultados, um exemplo de recurso de login funci…

Leia o artigo →
Desenvolvimento de software

Git merge vs rebase: diferenças, exemplos e quando usar cada um

Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.

Leia o artigo →
Desenvolvimento de software

List comprehension em Python: sintaxe, exemplos e quando evitar

List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.

Leia o artigo →
Bancos de dados e SQL

SQL JOIN explicado com exemplos (Inner, Left, Right, Full)

Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…

Leia o artigo →