Médio Rust

Teste de integração para uma calculadora

Enunciado

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.

Requisitos

  • A função soma deve estar em src/lib.rs e ser pública.
  • O teste de integração deve estar em tests/integracao.rs.
  • O teste deve usar assert_eq! e chamar calculadora::soma.

Código inicial

// src/lib.rs
pub fn soma(a: i32, b: i32) -> i32 {
    // implemente
}

// tests/integracao.rs
// use calculadora::soma;

// #[test]
// fn testa_soma_integracao() {
//     assert_eq!(soma(10, 20), 30);
// }

Saída esperada

running 1 test
test testa_soma_integracao ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Ver dica

No arquivo de integração, importe a crate com use calculadora::soma; (o nome da crate é o nome do pacote).

Mostrar solução
// src/lib.rs
pub fn soma(a: i32, b: i32) -> i32 {
    a + b // soma os dois números
}
// tests/integracao.rs
use calculadora::soma; // importa a função da biblioteca

#[test]
fn testa_soma_integracao() {
    assert_eq!(soma(10, 20), 30); // verifica 10 + 20 = 30
}

Passo a passo

  1. Em src/lib.rs, definimos pub fn soma para que seja visível fora da crate.
  2. Criamos o arquivo tests/integracao.rs na raiz do projeto.
  3. No teste de integração, usamos use calculadora::soma; para acessar a função pública.
  4. A função de teste é anotada com #[test].
  5. assert_eq!(soma(10, 20), 30) verifica o resultado.
  6. O cargo test compila e executa tanto os testes unitários quanto os de integração.

Por que funciona

Testes de integração são compilados como crates separadas que dependem da sua biblioteca. Eles só podem acessar itens públicos, simulando o uso por um consumidor externo.

Erros comuns

  • Esquecer pub na função soma: o teste de integração não consegue acessá-la.
  • Usar use crate::soma; no teste de integração: crate se refere à própria crate de teste, não à biblioteca. O correto é use calculadora::soma;.
  • Colocar o arquivo de integração em src/ em vez de tests/: o cargo test não o reconhece como teste de integração.

Outra forma de resolver

Poderia testar a função dentro do próprio src/lib.rs com um módulo tests, mas isso seria um teste unitário, não de integração.

Saída esperada

running 1 test
test testa_soma_integracao ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out