No description
Find a file
2026-08-31 11:36:09 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-08-31 11:36:09 +02:00
src fix(038): pedagogical MINOR fixes 2026-08-31 11:36:09 +02:00
tests fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-08-31 11:36:09 +02:00
.gitignore Initial commit 2026-08-31 09:35:26 +00:00
Cargo.lock initial content 2026-08-31 11:36:05 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-08-31 11:36:09 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-08-31 11:36:09 +02:00
README.md fix(038): pedagogical MINOR fixes 2026-08-31 11:36:09 +02:00

Lição 38: Testes Automatizados (Simuladores de Combate)

1. Narrativa

Antes de enviar o mecha Æther para o campo de batalha, cada sistema deve passar por simuladores rigorosos de combate. Testes automatizados são como esses simuladores — executam verificações automáticas e repetíveis que garantem que o mecha está pronto para qualquer situação. O piloto que domina os testes nunca é pego de surpresa por um bug no calor da batalha.

2. Conceito

Rust possui um framework de testes integrado ao compilador. Principais ferramentas:

  • #[test]: Marca uma função como teste unitário
  • #[should_panic]: Verifica que o código entra em pânico (caso esperado)
  • #[ignore]: Pula o teste na execução normal (cargo test -- --include-ignored para rodar)
  • assert!, assert_eq!, assert_ne!: Macros de verificação
  • Testes de integração: Arquivos em tests/, acessam a crate como usuário externo

3. Requisitos

  • Criar funções que podem ser testadas automaticamente
  • Usar assert!, assert_eq! e assert_ne! nos testes
  • Demonstrar #[should_panic] para casos de erro esperados
  • Implementar testes de integração no diretório tests/

4. Design de Dados

graph LR
    A[Código src/lib.rs] --> B[cargo test]
    B --> C[Testes Unitários]
    B --> D[Testes Integração]
    C --> E[assert! / assert_eq!]
    D --> E
    E --> F[Relatório: passed / failed]

5. Diagrama de Fluxo

flowchart TD
    A[cargo test] --> B{Compilação ok?}
    B -->|Sim| C[Executa testes unitários]
    B -->|Não| D[Erro de compilação]
    C --> E{should_panic?}
    E -->|Sim| F{Entrou em pânico?}
    F -->|Sim| G[PASS]
    F -->|Não| H[FAIL]
    E -->|Não| I{Assertion ok?}
    I -->|Sim| G
    I -->|Não| H
    G --> J[Relatório final]
    H --> J

6. Funções

Função Descrição
mecha_pronto Verifica se energia e blindagem são positivos
classificar_ameaca Retorna nível de ameaça baseado na distância
calcular_dano Calcula dano líquido após armadura
pular_mecha Verifica se mecha pode saltar
agrupar_sensores Divide sensores em grupos de N
extrair_status Extrai código numérico de mensagem de status
eficiencia_energetica Calcula eficiência (panica com "divisão por energia zero" se energia = 0)
filtrar_logs Filtra logs por nível mínimo de severidade

7. Exemplo

#[test]
fn test_mecha_pronto_ok() {
    assert!(mecha_pronto(100, 50));
}

#[test]
#[should_panic]
fn test_eficiencia_zero() {
    eficiencia_energetica(500, 0);
}

8. Missão

  1. Implementar mecha_pronto verificando energia > 0 e blindagem > 0
  2. Implementar classificar_ameaca com match em faixas de distância
  3. Implementar calcular_dano com cálculo de dano e piso em 0
  4. Implementar pular_mecha com verificação de energia ≥ 20 e peso < 1000
  5. Implementar agrupar_sensores usando chunks
  6. Implementar extrair_status com parse de string formatada
  7. Implementar eficiencia_energetica que panica com a mensagem "divisão por energia zero" se energia = 0
  8. Implementar filtrar_logs com iterador e filtro

9. Como Executar

cargo build
cargo test
cargo test -- --include-ignored  # roda testes ignorados também
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • cargo test compila e roda todos os testes automaticamente
  • Testes unitários ficam no mesmo arquivo do código, dentro de #[cfg(test)] mod tests
  • Testes de integração ficam em tests/ e usam a crate como dependência externa
  • #[should_panic] aceita expected = "mensagem" para verificar a mensagem de pânico
  • Use cargo test nome_do_teste para rodar apenas um teste específico

Nota: Esta lição fornece apenas testes de integração em tests/integracao.rs. Para praticar testes unitários, adicione um módulo #[cfg(test)] mod tests no final de src/lib.rs com funções marcadas por #[test]. Exemplo:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_mecha_pronto_ok() {
        assert!(mecha_pronto(100, 50));
    }
}