Pular para conteúdo

Aula 12 - Testes e Documentação 🧪

Objetivo

Objetivo: Profissionalizar o desenvolvimento em Rust aprendendo a escrever testes robustos e documentação automática que serve como ferramenta de especificação.


1. Testes Unitários: Garantindo a Qualidade 🛡️

O Rust possui ferramentas de teste integradas. Os testes unitários ficam no mesmo arquivo do código, em um módulo especial.

pub fn soma(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)] // Compila este módulo apenas ao rodar testes
mod tests {
    use super::*; // Importa funções do arquivo pai

    #[test]
    fn test_soma() {
        assert_eq!(soma(2, 2), 4);
    }
}

Para rodar os testes:

$ cargo test


2. Testes de Integração 🔗

Servem para testar sua biblioteca como um todo, como se você fosse um usuário externo. Ficam na pasta tests/ na raiz do projeto.

$ ls
src/
tests/
  └── integration_test.rs

3. Documentação com rustdoc 📖

Rust usa comentários especiais (///) para gerar documentação HTML rica automaticamente.

/// Adiciona dois números e retorna a soma.
///
/// # Exemplos
///
/// ```
/// let resultado = meu_projeto::soma(2, 2);
/// assert_eq!(resultado, 4);
/// ```
pub fn soma(a: i32, b: i32) -> i32 {
    a + b
}

Para gerar e abrir a documentação:

$ cargo doc --open


4. Testes Doc (Doc-tests) 🧪✨

Um dos recursos mais fantásticos do Rust: os exemplos de código na sua documentação são testados automaticamente pelo cargo test. Isso garante que sua documentação nunca fique desatualizada!


5. Visualização: Pirâmide de Testes no Rust 📐

graph TD
    A["Testes Unitários (Muitos, rápidos, internos)"] --> B["Testes de Integração (Médios, externos)"]
    B --> C["Doc-tests (Exemplos reais na documentação)"]
    style A fill:#dfd
    style C fill:#f9f

6. Mini-Projeto: Biblioteca de Utilidades Validada 📚

Crie um novo projeto de biblioteca (cargo new --lib minha_lib): 1. Implemente funções matemáticas simples. 2. Adicione documentação profissional com a seção # Exemplos. 3. Escreva testes unitários para cada função. 4. Crie um arquivo em tests/ para validar a integração das funções. 5. Gere a documentação e verifique se os exemplos estão renderizados corretamente.


7. Exercício de Fixação 🧠

  1. Qual a diferença de localização entre testes unitários e testes de integração?
  2. Para que serve o atributo #[cfg(test)]?
  3. Como o rustdoc ajuda a manter o código e a documentação em sincronia?

Próxima Aula: Vamos encarar o desafio da Concorrência Segura! 🧵