Fácil Rust
Testando uma função de multiplicação
Enunciado
Crie uma função multiplica(a: i32, b: i32) -> i32 e escreva um teste unitário que verifique se multiplica(3, 4) retorna 12.
Requisitos
- A função
multiplicadeve retornar o produto dos dois argumentos. - O teste deve usar
assert_eq!para comparar o resultado com o valor esperado. - O teste deve estar dentro do módulo
testscom#[cfg(test)].
Código inicial
pub fn multiplica(a: i32, b: i32) -> i32 {
// implemente
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn testa_multiplicacao() {
// escreva o teste
}
}
fn main() {
println!("{}", multiplica(3, 4));
}
Saída esperada
12
Ver dica
Use a * b para multiplicar e assert_eq!(multiplica(3, 4), 12) no teste.
Mostrar solução
pub fn multiplica(a: i32, b: i32) -> i32 {
a * b // retorna o produto
}
#[cfg(test)]
mod tests {
use super::*; // importa a função do módulo pai
#[test]
fn testa_multiplicacao() {
assert_eq!(multiplica(3, 4), 12); // verifica se 3 * 4 = 12
}
}
fn main() {
println!("{}", multiplica(3, 4));
}
Passo a passo
- Definimos
multiplicaque recebe doisi32e retornaa * b. - O módulo
testsé anotado com#[cfg(test)]para ser compilado apenas em testes. use super::*;trazmultiplicapara o escopo do teste.- A função de teste é marcada com
#[test]. - Dentro dela,
assert_eq!(multiplica(3, 4), 12)compara o resultado com 12. - Se a comparação falhar, o teste entra em pânico e o
cargo testreporta falha.
Por que funciona
O cargo test descobre funções anotadas com #[test] e as executa. assert_eq! verifica igualdade e, em caso de falha, mostra os valores esperado e obtido, facilitando o diagnóstico.
Erros comuns
- Esquecer
use super::*;dentro do módulotests: o compilador não encontramultiplica. - Usar
assert!em vez deassert_eq!: funciona, mas a mensagem de erro é menos informativa. - Colocar o teste fora do módulo
testssem#[cfg(test)]: o código de teste é compilado no binário final.
Outra forma de resolver
Poderia usar assert!(multiplica(3, 4) == 12), mas assert_eq! é preferível por mostrar os valores na falha.
Saída esperada
12