Pular para o conteúdo
Skillpedia
Testes280 mil · #118

rust-testing

Faz seu agente criar testes para código Rust. Ele verifica se as partes do programa funcionam sozinhas ou juntas, e testa cenários variados.

O que ela faz

Este código ajuda a criar e organizar testes para programas escritos na linguagem Rust. Ele ensina como verificar se o seu código funciona corretamente, seguindo um método chamado TDD (Desenvolvimento Guiado por Testes).

Quando usar

  • ✓Ao escrever novas partes do seu código Rust.
  • ✓Ao adicionar verificações de qualidade ao código já existente.
  • ✓Ao querer garantir que seu código funciona com diferentes tipos de entrada.

Exemplo do que pedir para a IA

“Como posso testar se a minha função que soma números funciona corretamente em Rust?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/rust-testing/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/rust-testing/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele funciona guiando você a escrever um teste que falha primeiro, depois escrever o código mínimo para fazê-lo passar, e então refatorar. Isso garante que o código está correto e bem escrito.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill rust-testing

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/rust-testing/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Teste em Rust

Padrões abrangentes de teste em Rust para escrever testes confiáveis e de fácil manutenção, seguindo a metodologia TDD.

Quando Usar

  • Escrevendo novas funções, métodos ou traits em Rust
  • Adicionando cobertura de testes a código existente
  • Criando benchmarks para código crítico de performance
  • Implementando testes baseados em propriedades para validação de entrada
  • Seguindo o fluxo de trabalho TDD em projetos Rust

Como Funciona

  1. Identifique o código alvo — Encontre a função, trait ou módulo a ser testado
  2. Escreva um teste — Use #[test] em um módulo #[cfg(test)], rstest para testes parametrizados, ou proptest para testes baseados em propriedades
  3. Mock de dependências — Use mockall para isolar a unidade sob teste
  4. Execute os testes (VERMELHO) — Verifique se o teste falha com o erro esperado
  5. Implemente (VERDE) — Escreva o código mínimo para passar
  6. Refatore — Melhore mantendo os testes verdes
  7. Verifique a cobertura — Use cargo-llvm-cov, mire em 80%+

Fluxo de Trabalho TDD para Rust

O Ciclo VERMELHO-VERDE-REFACTOR

RED     → Write a failing test first
GREEN   → Write minimal code to pass the test
REFACTOR → Improve code while keeping tests green
REPEAT  → Continue with next requirement

TDD Passo a Passo em Rust

// RED: Write test first, use todo!() as placeholder
pub fn add(a: i32, b: i32) -> i32 { todo!() }

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_add() { assert_eq!(add(2, 3), 5); }
}
// cargo test → panics at 'not yet implemented'
// GREEN: Replace todo!() with minimal implementation
pub fn add(a: i32, b: i32) -> i32 { a + b }
// cargo test → PASS, then REFACTOR while keeping tests green

Testes de Unidade

Organização de Testes em Nível de Módulo

// src/user.rs
pub struct User {
    pub name: String,
    pub email: String,
}

impl User {
    pub fn new(name: impl Into<String>, email: impl Into<String>) -> Result<Self, String> {
        let email = email.into();
        if !email.contains('@') {
            return Err(format!("invalid email: {email}"));
        }
        Ok(Self { name: name.into(), email })
    }

    pub fn display_name(&self) -> &str {
        &self.name
    }
}

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

    #[test]
    fn creates_user_with_valid_email() {
        let user = User::new("Alice", "alice@example.com").unwrap();
        assert_eq!(user.display_name(), "Alice");
        assert_eq!(user.email, "alice@example.com");
    }

    #[test]
    fn rejects_invalid_email() {
        let result = User::new("Bob", "not-an-email");
        assert!(result.is_err());
        assert!(result.unwrap_err().contains("invalid email"));
    }
}

Macros de Assertiva

assert_eq!(2 + 2, 4);                                    // Equality
assert_ne!(2 + 2, 5);                                    // Inequality
assert!(vec![1, 2, 3].contains(&2));                     // Boolean
assert_eq!(value, 42, "expected 42 but got {value}");    // Custom message
assert!((0.1_f64 + 0.2 - 0.3).abs() < f64::EPSILON);   // Float comparison

Testes de Erro e Pânico

Testando Retornos de Result

#[test]
fn parse_returns_error_for_invalid_input() {
    let result = parse_config("}{invalid");
    assert!(result.is_err());

    // Assert specific error variant
    let err = result.unwrap_err();
    assert!(matches!(err, ConfigError::ParseError(_)));
}

#[test]
fn parse_succeeds_for_valid_input() -> Result<(), Box<dyn std::error::Error>> {
    let config = parse_config(r#"{"port": 8080}"#)?;
    assert_eq!(config.port, 8080);
    Ok(()) // Test fails if any ? returns Err
}

Testando Pânicos

#[test]
#[should_panic]
fn panics_on_empty_input() {
    process(&[]);
}

#[test]
#[should_panic(expected = "index out of bounds")]
fn panics_with_specific_message() {
    let v: Vec<i32> = vec![];
    let _ = v[0];
}

Testes de Integração

Estrutura de Arquivos

my_crate/
├── src/
│   └── lib.rs
├── tests/              # Integration tests
│   ├── api_test.rs     # Each file is a separate test binary
│   ├── db_test.rs
│   └── common/         # Shared test utilities
│       └── mod.rs

Escrevendo Testes de Integração

// tests/api_test.rs
use my_crate::{App, Config};

#[test]
fn full_request_lifecycle() {
    let config = Config::test_default();
    let app = App::new(config);

    let response = app.handle_request("/health");
    assert_eq!(response.status, 200);
    assert_eq!(response.body, "OK");
}

Testes Assíncronos

Com Tokio

#[tokio::test]

…
Perguntas frequentes

O que é TDD?

TDD significa Desenvolvimento Guiado por Testes. É uma técnica onde você escreve um teste antes de escrever o código real. O teste falha, você escreve o código para fazê-lo passar, e depois melhora o código.

O que são testes unitários?

Testes unitários verificam pequenas partes isoladas do seu código, como uma única função ou método, para garantir que elas funcionam como esperado.

O que são testes de integração?

Testes de integração verificam como diferentes partes do seu código funcionam juntas. Eles testam o sistema como um todo ou grandes componentes.

Detalhes

Descrição original do autor

Rust testing patterns including unit tests, integration tests, async testing, property-based testing, mocking, and coverage. Follows TDD methodology. Use when writing Rust tests — unit, integration, async, property-based, or coverage.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#118
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas