Da trilha de Rust Este conceito ainda não saiu como card do dia. ir para o card de hoje

Rust Testes Intermediário

Testes

Em Rust, testes são funções anotadas com #[test] que verificam se o comportamento do código está correto. O framework de testes embutido executa todos os testes quando você roda cargo test, reportando quais passaram e quais falharam.

Dentro de um teste, usamos macros como assert_eq!, assert! e assert_ne! para comparar valores esperados com os obtidos. Se a asserção falhar, o teste entra em pânico e é marcado como falho.

Além dos testes unitários (dentro do mesmo arquivo, no módulo tests), Rust suporta testes de integração: arquivos na pasta tests/ do projeto que testam a biblioteca como se fosse um usuário externo, usando apenas a API pública.

O comando cargo test compila e roda todos os testes, incluindo os unitários e os de integração. Ele também aceita filtros, como cargo test nome_do_teste, para executar apenas testes específicos.

Pontos-chave

  • A anotação #[test] marca uma função como teste; o cargo test a executa automaticamente.
  • assert_eq!(a, b) verifica se dois valores são iguais; se não forem, o teste falha com uma mensagem detalhada.
  • Testes de integração ficam na pasta tests/ e usam a crate como uma dependência externa.
  • cargo test roda todos os testes do projeto, incluindo unitários e de integração.
  • Testes que devem falhar podem ser anotados com #[should_panic].
calculadora.rs
// calculadora.rs
pub fn soma(a: i32, b: i32) -> i32 {
    a + b
}

pub fn divide(a: i32, b: i32) -> Result<i32, String> {
    if b == 0 {
        Err("divisão por zero".to_string())
    } else {
        Ok(a / b)
    }
}

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

    #[test]
    fn testa_soma() {
        assert_eq!(soma(2, 3), 5);
    }

    #[test]
    fn testa_divisao_ok() {
        assert_eq!(divide(10, 2), Ok(5));
    }

    #[test]
    fn testa_divisao_por_zero() {
        assert!(divide(10, 0).is_err());
    }
}

fn main() {
    println!("2 + 3 = {}", soma(2, 3));
    println!("10 / 2 = {:?}", divide(10, 2));
    println!("10 / 0 = {:?}", divide(10, 0));
}

Exercícios

  1. 1
    Fácil

    Testando uma função de multiplicação

    Crie uma função multiplica(a: i32, b: i32) -> i32 e escreva um teste unitário que verifique se multiplica(3, 4) retorna 12.

    Resolver
  2. 2
    Médio

    Teste de integração para uma calculadora

    Crie uma biblioteca com a função soma(a: i32, b: i32) -> i32 e um teste de integração no arquivo tests/integracao.rs que verifique se soma(10, 20) retorna 30.

    Resolver
  3. 3
    Desafio

    Testando erros e pânicos

    Implemente uma função raiz_quadrada(x: f64) -> Result<f64, String> que retorna Err para números negativos, e uma função divide(a: i32, b: i32) -> i32 que entra em pânico se b == 0. Escreva testes que cubram: sucesso da raiz, erro da raiz, e pânico na divisão usando #[should_panic].

    Resolver

Continue estudando