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; ocargo testa 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 testroda todos os testes do projeto, incluindo unitários e de integração.- Testes que devem falhar podem ser anotados com
#[should_panic].
// 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));
}