No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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-ignoredpara 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!eassert_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
- Implementar
mecha_prontoverificando energia > 0 e blindagem > 0 - Implementar
classificar_ameacacom match em faixas de distância - Implementar
calcular_danocom cálculo de dano e piso em 0 - Implementar
pular_mechacom verificação de energia ≥ 20 e peso < 1000 - Implementar
agrupar_sensoresusando chunks - Implementar
extrair_statuscom parse de string formatada - Implementar
eficiencia_energeticaque panica com a mensagem"divisão por energia zero"se energia = 0 - Implementar
filtrar_logscom 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 testcompila 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]aceitaexpected = "mensagem"para verificar a mensagem de pânico- Use
cargo test nome_do_testepara 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 testsno final desrc/lib.rscom funções marcadas por#[test]. Exemplo:#[cfg(test)] mod tests { use super::*; #[test] fn test_mecha_pronto_ok() { assert!(mecha_pronto(100, 50)); } }