GH GambleHub

Testes de unit vs Integration

1) Por que distinguir tipos de testes

Os testes de granulação corretos tornam o desenvolvimento previsível: Unit capta defeitos de lógica rápido e barato; Integration verificam as conexões dos módulos, transporte real e «cola». Juntos, reduzem a regressão e aceleram os lançamentos.

2) Definições e limites

Teste de unit

Verifica uma pequena unidade de comportamento (função, classe, use-case) isolada.
Dependências externas substituídas (mock/stub/fake).
Rápido (ms-10 ms), determinado.

Teste de integração

Verifica a interação de vários componentes reais: banco de dados, corretor (Kafka/RabbitMQ), HTTP/gRPC, sistema de arquivos, dinheiro.
Mínimo de mocos, protocolos reais.
Mais lento (centenas de ms-segundos), mais caro em suporte.

💡 Regra: Assim que «transitar o processo/socket/BD», já estamos em águas de integração.

3) A pirâmide de testes (e não os pedaços de gelo)

Base: Unit (70% a 80% em número) - barato, rápido.
Camada média: Integração/Composto (15-25%) - caminhos e contratos críticos.
Superior: E2E/UX/Exploratory (5-10%) - mínimo suficiente.
Para os lados: Static Analisis/Lint/Estando check-in e Mutation testing como amplificadores de qualidade.

4) O que dar Unit e o quê - Integration

TarefaTipoPorquê
Pura lógica empresarial (validações, cálculos de comissões, idempotidade das chaves)UnitRápido, determinado, muitos limites
Muppings DTO↔model, seriado, parsingUnitMuitas malas, fácil de isolar
Repositórios/Solicitações ORMsIntegration (с test DB)«Comportamento» ÓRM e SQL nuances são visíveis apenas em um banco de dados vivo
Contrato HTTP (estatais, cabeçalhos, esquemas)Integration / ContractPrecisamos de uma pilha de HTTP + JSON Schema/OpenAPI
Saga/Outbox, retais, deadlineIntegration / ComponentTiming, transacção, corretor
Rate limit в gatewayIntegrationRedis/state/temporizadores
Webhooks (HMAC, repetição)Integration / CDCAssinaturas, relógios, características de rede

5) Dados e ficturas

Unit

Inline ficstures/bilders (factory methods).
Teste de tabela (tablet-driven) para os valores de limite.
Abordagem property-based para invariantes (por exemplo, «soma de débitos = soma de crédito»).

Integration

Ambiente Hermetic: Testcontainers/Docker Compose levantam 'postgres + redis + kafka + wiremock'.
Seed inicial em BD/dinheiro e limpeza após (transação/rollback, truncate).
Relógios/temporizadores são falsos (controlados), senão flakes.

6) Ferramentas e pattern

Mocks/Stubs/Fakes/Spies:
  • Stub - resposta fixa (barato).
  • Mock - Verificação de interações/número de chamadas.
  • Fake - Implementação simplificada (por exemplo, In-Memory Repo).
  • Contract testing (CDC): Pact/Swagger-based - Registramos as expectativas do cliente e verificamos o provedor.
  • WireMock/MockServer - Braços HTTP para serviços de terceiros.
  • Testcontainers - BD/corretores vivos localmente e no CI sem «zoológico».

7) Exemplos

7. 1 Unit: Idempotidade de pagamento (pseudocode)

python def test_idempotent_create_payment_returns_same_id():
repo = InMemoryPayments()
service = Payments(repo)

first = service. create(amount=100, key="abc")
second = service. create(amount=100, key="abc")

assert first. id == second. id assert repo. count() == 1

7. 2 Integração: assinatura webhook (HMAC) + repetição

bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Teste:
  • WireMock dá o evento com 'X-Timestamp' e assinatura.
  • O aplicativo verifica o HMAC, deduz por 'event _ id', e a repetição em 5 segundos não cria a tiragem.
  • Verificamos «200» e que a gravação é uma só.

7. 3 CDC: contrato do cliente para o provedor

O cliente está formando um Pact ("POST/v1/payout" → '201 "com o esquema).
O provedor da CI está a verificar o contrato no seu estande.

8) Velocidade, paralelismo, flocos

Unit deve funcionar <100 ms para o teste; o pacote é de segundos.
Integração - paralelismo por contêineres/portos; usar as migrações no início.

Antídoto Flaky:
  • tempo controlado (fake clock),
  • espera por um evento claro, não por 'sleep',
  • liminares estáveis (retrai com jitter testar com determinação).

9) Métricas de qualidade

Coverage (linhas/ramos): útil para observar a tendência, mas não o alvo.
Mutation testing (PIT/Mutmut): mostra se os testes «matam» alterações falsas - a força real do assurance.
Teste duration e flaky rate: alertas ao crescimento.
Defect containment: proporção de bugs interceptados antes da produção.

10) Incorporação em CI/CD

Jobs: unit → integration → e2e (fan-out por serviços).
A caixa de dependências, matrizes paralelas de base de dados/linguagens/versões.
Relatórios: JUNit/Allure + artefatos de logs de contêineres (em queda).
Gate: «unit verde + integração crítica» - condição de mágoa; e2e - em nightly.

Exemplo de matriz (GitHub Action, fatia):
yaml strategy:
matrix:
db: [postgres14, postgres16]
steps:
- run: docker run -d --name db -e POSTGRES_PASSWORD=pw postgres:${{ matrix. db }}
- run: pytest -m "unit" -q
- run: pytest -m "integration" -q

11) Microsserviços e eventos

Contratos de serviço: OpenAPI/Protobuf são versionizados; testes de compatibilidade (backward).

Event-driven:
  • Unit: mupping eventos de domínio e invariantes.
  • Integration: publicação/assinatura em corretor real (Kafka), outbox/inbox semântica, excactly-once simulação (pelo menos, idempotent).
  • Testes de retração/duplicação/reordenação (out-of-order).

12) Dados e isolamento em Integration

Cada teste → um padrão único/BD (Testcontainers JDBC URL '? TC _ TMPFs =/var/lima/postgresql/data: rw').
Ficstures de transação (begin→run→rollback) aceleram a limpeza.
Para Redis/cachê, o prefixo 'teste' é o prefixo-chave para o teardown.

13) Especificidades do iGaming/Finanças

Dinheiro e limites: testes property-based para invariantes (saldo de ≥ 0, limitações totais).
Regulação: verificação de registro (auditoria-logos escrita), eventos imutáveis.
Pagamentos/PSP: Testes de integração HMAC/mTLS, 'Retry-After', Idempotação, Dedup 'jti'.
Jogo responsável: testes de regras de liminares/kuldowns; «vchera→segodnya» em fake clock.

14) Antipattern

«Unit» que elevam o BD/NTTR já é uma integração (confunde camadas e desacelera CI).
Alta coveragem por meio de alegações vazias («coberto, mas não verificado»).
Morologias de serviços de terceiros onde você precisa de um contrato (quebrado quando atualizado).
Testes com 'sleep (5)' em vez de expectativas de evento/condição.
Base de teste geral para testes paralelos → corridas e flocos.

15) Folha de cheque pró-prontidão

  • A pirâmide é definida por% de Unit/Integration/E2E e o objetivo de tempo de extração.
  • As units são isoladas, rápidas, cobrem os limites e os invariantes.
  • O Integration usa um ambiente hermético (Testcontainers/Compose) sem bits compartilhados.
  • Os testes contratuais (OpenAPI/Pact) são validados em CI.
  • Os dados dos testes são: seed/rollback/prefixados, fake clock.
  • Teste paralelo, relatórios de JUnit/Allure, artefatos de logs de contêineres.
  • Métricas: duration, flaky rate, mutation score; Alertas de degradação.
  • Cenários de pagamento/webhook: HMAC/mTLS, retais, Idempotidade, Dedup.
  • Documentação de estratégia e exemplos de modelos de teste.

16) TL; DR

Unit - o máximo de lógica, o mínimo de ambiente; Integration é o mínimo de mocos, o máximo de realismo. Mantenha a pirâmide: as Unit rápidas capturam 80% dos defeitos, a Integration confirma os laços e os contratos. Use contêineres herméticos, testes contratuais, fake clock e paralelismo. Mede não apenas coverage, mas também mutation score e flaky rate. Verifique especialmente os caminhos de pagamento/webhook, assinaturas, retraias e idempotidade.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.