affaan-m/ECC

rust-testing

Rust testing patterns including unit tests, integration tests, async testing, property-based testing, mocking, and coverage. Follows TDD methodology.

79CollectingRuns scripts
See how to use itView GitHub source
npx skills add https://github.com/affaan-m/ECC --skill "docs/tr/skills/rust-testing"
Automated source guide

Source checked Jul 28, 2026·Refresh due Oct 26, 2026

Reorganized from the pinned upstream SKILL.md

Turn rust-testing's source instructions into a guide you can follow

According to the pinned SKILL.md from affaan-m/ECC: TDD metodolojisini takip ederek güvenilir, bakım yapılabilir testler yazmak için kapsamlı Rust test desenleri.

npx skills add https://github.com/affaan-m/ECC --skill "docs/tr/skills/rust-testing"
Check the pinned source

Best fit

  • Rust testing patterns including unit tests, integration tests, async testing, property-based testing, mocking, and coverage. Follows TDD methodology.

Bring this context

  • A concrete task that matches the documented purpose of rust-testing.
  • The files, examples, or context the task depends on.
  • Your constraints, target environment, and definition of done.

Expected outputs

  • A result that follows the pinned rust-testing instructions.
  • A concise record of assumptions, inputs used, and unresolved questions.
  • A final check against the source workflow and relevant permission signals.

Key source sections

Read rust-testing through these 5 source sections

Sections are extracted automatically from the pinned SKILL.md and link back to the source.

01

Ne Zaman Kullanılır

Yeni Rust fonksiyonları, metotları veya trait'leri yazma

SKILL.md · Ne Zaman Kullanılır
Yeni Rust fonksiyonları, metotları veya trait'leri yazmaMevcut koda test kapsamı eklemePerformans-kritik kod için benchmark'lar oluşturma
02

Nasıl Çalışır

1. Hedef kodu tanımla — Test edilecek fonksiyon, trait veya modülü bul 2. Bir test yaz — [cfg(test)] modülünde [test] kullan, parametreli testler için rstest veya property-based testler için proptest 3. Bağımlılıkları mock'la — Test altındaki birimi izole etmek için mockall kull…

SKILL.md · Nasıl Çalışır
Hedef kodu tanımla — Test edilecek fonksiyon, trait veya modülü bulBir test yaz — [cfg(test)] modülünde [test] kullan, parametreli testler için rstest veya property-based testler için proptestBağımlılıkları mock'la — Test altındaki birimi izole etmek için mockall kullan
03

Rust için TDD İş Akışı

Review the “Rust için TDD İş Akışı” section in the pinned source before continuing.

SKILL.md · Rust için TDD İş Akışı
Review and apply the “Rust için TDD İş Akışı” source section.
04

RED-GREEN-REFACTOR Döngüsü

Review the “RED-GREEN-REFACTOR Döngüsü” section in the pinned source before continuing.

SKILL.md · RED-GREEN-REFACTOR Döngüsü
Review and apply the “RED-GREEN-REFACTOR Döngüsü” source section.
05

Rust'ta Adım-Adım TDD

Review the “Rust'ta Adım-Adım TDD” section in the pinned source before continuing.

SKILL.md · Rust'ta Adım-Adım TDD
Review and apply the “Rust'ta Adım-Adım TDD” source section.

SkillSignal prompt templates

Provide the task, context, and acceptance criteria

These prompts were written by SkillSignal from the source structure; they are not upstream text.

Task-start prompt

Confirm source fit, inputs, and outputs before acting.

Use rust-testing to help me with: [specific task]. Context: [files, data, or background]. Constraints: [environment, scope, and prohibited actions]. Before acting, check the pinned SKILL.md and explain which sections apply, what inputs are still missing, and what you will deliver.

Source-guided execution

Make the Agent explicitly follow the key extracted sections.

Apply the pinned rust-testing source to [task]. Pay particular attention to these source sections: “Ne Zaman Kullanılır”, “Nasıl Çalışır”, “Rust için TDD İş Akışı”, “RED-GREEN-REFACTOR Döngüsü”, “Rust'ta Adım-Adım TDD”. Preserve the important decision at each step. Mark facts not covered by the source as “needs confirmation” instead of inventing them. Then verify the result against my acceptance criteria: [criteria].

Result-review prompt

Check omissions, permissions, and source drift before delivery.

Review the current rust-testing result: (1) does it satisfy the original task; (2) were any applicable steps or limits in the pinned SKILL.md missed; (3) did it perform any unauthorized file, command, network, or data action; and (4) which conclusions remain unverified? List issues first, then fix only what the source or user authorization supports.

Output checklist

Verify each item before delivery

The task matches the purpose documented in the SKILL.md.

The source section “Ne Zaman Kullanılır” has been checked.

The source section “Nasıl Çalışır” has been checked.

The source section “Rust için TDD İş Akışı” has been checked.

The source section “RED-GREEN-REFACTOR Döngüsü” has been checked.

Inputs, constraints, and acceptance criteria are explicit.

Unverified facts, compatibility, and outcome claims are clearly marked.

Any file, command, network, or data action has been reviewed.

Choose a different workflow

When another Skill is the better fit

FAQ

What does rust-testing do?

TDD metodolojisini takip ederek güvenilir, bakım yapılabilir testler yazmak için kapsamlı Rust test desenleri.

How do I start using rust-testing?

The catalog detected this source-specific install command: npx skills add https://github.com/affaan-m/ECC --skill "docs/tr/skills/rust-testing". Inspect the command and pinned source before running it.

Which Agent platforms does it declare?

No dedicated Agent platform is declared in the pinned source record.

Repository stars
234,327
Repository forks
35,711
Quality
79/100
Source repository last pushed

Quality breakdown

Based on traceable docs and repository signals; stars are not treated as quality.

79/100
Documentation29/30
Specificity15/25
Maintenance20/20
Trust signals15/25
View original Skill.mdThis page is parsed directly from the repository SKILL.md without editorial rewriting. Collected: Jul 28, 2026 · about 2 min

Rust Test Desenleri

TDD metodolojisini takip ederek güvenilir, bakım yapılabilir testler yazmak için kapsamlı Rust test desenleri.

Ne Zaman Kullanılır

  • Yeni Rust fonksiyonları, metotları veya trait'leri yazma
  • Mevcut koda test kapsamı ekleme
  • Performans-kritik kod için benchmark'lar oluşturma
  • Girdi doğrulama için property-based testler uygulama
  • Rust projelerinde TDD iş akışını takip etme

Nasıl Çalışır

  1. Hedef kodu tanımla — Test edilecek fonksiyon, trait veya modülü bul
  2. Bir test yaz#[cfg(test)] modülünde #[test] kullan, parametreli testler için rstest veya property-based testler için proptest
  3. Bağımlılıkları mock'la — Test altındaki birimi izole etmek için mockall kullan
  4. Testleri çalıştır (RED) — Testin beklenen hata ile başarısız olduğunu doğrula
  5. Uygula (GREEN) — Geçmek için minimal kod yaz
  6. Refactor — Testleri yeşil tutarken iyileştir
  7. Kapsamı kontrol et — cargo-llvm-cov kullan, 80%+ hedefle

Rust için TDD İş Akışı

RED-GREEN-REFACTOR Döngüsü

RED     → Önce başarısız bir test yaz
GREEN   → Testi geçmek için minimal kod yaz
REFACTOR → Testleri yeşil tutarken kodu iyileştir
REPEAT  → Bir sonraki gereksinimle devam et

Rust'ta Adım-Adım TDD

// RED: Önce testi yaz, yer tutucu olarak todo!() kullan
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 → 'not yet implemented'da panic
// GREEN: todo!()'yu minimal implementasyonla değiştir
pub fn add(a: i32, b: i32) -> i32 { a + b }
// cargo test → GEÇTİ, sonra testleri yeşil tutarken REFACTOR

Unit Testler

Modül Seviyesi Test Organizasyonu

// 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"));
    }
}

Assertion Makroları

assert_eq!(2 + 2, 4);                                    // Eşitlik
assert_ne!(2 + 2, 5);                                    // Eşitsizlik
assert!(vec![1, 2, 3].contains(&2));                     // Boolean
assert_eq!(value, 42, "expected 42 but got {value}");    // Özel mesaj
assert!((0.1_f64 + 0.2 - 0.3).abs() < f64::EPSILON);   // Float karşılaştırma

Hata ve Panic Testi

Result Dönüşlerini Test Etme

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

    // Spesifik hata varyantını doğrula
    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(()) // Herhangi bir ? Err döndürürse test başarısız olur
}

Panic'leri Test Etme

#[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];
}

Entegrasyon Testleri

Dosya Yapısı

my_crate/
├── src/
│   └── lib.rs
├── tests/              # Entegrasyon testleri
│   ├── api_test.rs     # Her dosya ayrı bir test binary'si
│   ├── db_test.rs
│   └── common/         # Paylaşılan test yardımcıları
│       └── mod.rs

Entegrasyon Testleri Yazma

// 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");
}

Async Testler

Tokio ile

#[tokio::test]
async fn fetches_data_successfully() {
    let client = TestClient::new().await;
    let result = client.get("/data").await;
    assert!(result.is_ok());
    assert_eq!(result.unwrap().items.len(), 3);
}

#[tokio::test]
async fn handles_timeout() {
    use std::time::Duration;
    let result = tokio::time::timeout(
        Duration::from_millis(100),
        slow_operation(),
    ).await;

    assert!(result.is_err(), "should have timed out");
}

Test Organizasyon Desenleri

rstest ile Parametreli Testler

use rstest::{rstest, fixture};

#[rstest]
#[case("hello", 5)]
#[case("", 0)]
#[case("rust", 4)]
fn test_string_length(#[case] input: &str, #[case] expected: usize) {
    assert_eq!(input.len(), expected);
}

// Fixture'lar
#[fixture]
fn test_db() -> TestDb {
    TestDb::new_in_memory()
}

#[rstest]
fn test_insert(test_db: TestDb) {
    test_db.insert("key", "value");
    assert_eq!(test_db.get("key"), Some("value".into()));
}

Test Yardımcıları

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

    /// Mantıklı varsayılanlarla test kullanıcısı oluşturur.
    fn make_user(name: &str) -> User {
        User::new(name, &format!("{name}@test.com")).unwrap()
    }

    #[test]
    fn user_display() {
        let user = make_user("alice");
        assert_eq!(user.display_name(), "alice");
    }
}

proptest ile Property-Based Testing

Temel Property Testleri

use proptest::prelude::*;

proptest! {
    #[test]
    fn encode_decode_roundtrip(input in ".*") {
        let encoded = encode(&input);
        let decoded = decode(&encoded).unwrap();
        assert_eq!(input, decoded);
    }

    #[test]
    fn sort_preserves_length(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
        let original_len = vec.len();
        vec.sort();
        assert_eq!(vec.len(), original_len);
    }

    #[test]
    fn sort_produces_ordered_output(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
        vec.sort();
        for window in vec.windows(2) {
            assert!(window[0] <= window[1]);
        }
    }
}

Özel Stratejiler

use proptest::prelude::*;

fn valid_email() -> impl Strategy<Value = String> {
    ("[a-z]{1,10}", "[a-z]{1,5}")
        .prop_map(|(user, domain)| format!("{user}@{domain}.com"))
}

proptest! {
    #[test]
    fn accepts_valid_emails(email in valid_email()) {
        assert!(User::new("Test", &email).is_ok());
    }
}

mockall ile Mock'lama

Trait-Tabanlı Mock'lama

use mockall::{automock, predicate::eq};

#[automock]
trait UserRepository {
    fn find_by_id(&self, id: u64) -> Option<User>;
    fn save(&self, user: &User) -> Result<(), StorageError>;
}

#[test]
fn service_returns_user_when_found() {
    let mut mock = MockUserRepository::new();
    mock.expect_find_by_id()
        .with(eq(42))
        .times(1)
        .returning(|_| Some(User { id: 42, name: "Alice".into() }));

    let service = UserService::new(Box::new(mock));
    let user = service.get_user(42).unwrap();
    assert_eq!(user.name, "Alice");
}

#[test]
fn service_returns_none_when_not_found() {
    let mut mock = MockUserRepository::new();
    mock.expect_find_by_id()
        .returning(|_| None);

    let service = UserService::new(Box::new(mock));
    assert!(service.get_user(99).is_none());
}

Doc Testleri

Çalıştırılabilir Dokümantasyon

/// İki sayıyı toplar.
///
/// # Examples
///
/// ```
/// use my_crate::add;
///
/// assert_eq!(add(2, 3), 5);
/// assert_eq!(add(-1, 1), 0);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// Bir config string'i parse eder.
///
/// # Errors
///
/// Girdi geçerli TOML değilse `Err` döner.
///
/// ```no_run
/// use my_crate::parse_config;
///
/// let config = parse_config(r#"port = 8080"#).unwrap();
/// assert_eq!(config.port, 8080);
/// ```
///
/// ```no_run
/// use my_crate::parse_config;
///
/// assert!(parse_config("}{invalid").is_err());
/// ```
pub fn parse_config(input: &str) -> Result<Config, ParseError> {
    todo!()
}

Criterion ile Benchmark'lama

# Cargo.toml
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }

[[bench]]
name = "benchmark"
harness = false
// benches/benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn fibonacci(n: u64) -> u64 {
    match n {
        0 | 1 => n,
        _ => fibonacci(n - 1) + fibonacci(n - 2),
    }
}

fn bench_fibonacci(c: &mut Criterion) {
    c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}

criterion_group!(benches, bench_fibonacci);
criterion_main!(benches);

Test Kapsamı

Kapsamı Çalıştırma

# Kurulum: cargo install cargo-llvm-cov (veya CI'da taiki-e/install-action kullan)
cargo llvm-cov                    # Özet
cargo llvm-cov --html             # HTML raporu
cargo llvm-cov --lcov > lcov.info # CI için LCOV formatı
cargo llvm-cov --fail-under-lines 80  # Eşiğin altındaysa başarısız yap

Kapsam Hedefleri

Kod TipiHedef
Kritik iş mantığı100%
Public API90%+
Genel kod80%+
Oluşturulmuş / FFI binding'leriHariç tut

Test Komutları

cargo test                        # Tüm testleri çalıştır
cargo test -- --nocapture         # println çıktısını göster
cargo test test_name              # Desene uyan testleri çalıştır
cargo test --lib                  # Sadece unit testler
cargo test --test api_test        # Sadece entegrasyon testleri
cargo test --doc                  # Sadece doc testleri
cargo test --no-fail-fast         # İlk başarısızlıkta durma
cargo test -- --ignored           # Yok sayılan testleri çalıştır

En İyi Uygulamalar

YAPIN:

  • ÖNCE testleri yazın (TDD)
  • Unit testler için #[cfg(test)] modülleri kullanın
  • Implementasyon değil, davranışı test edin
  • Senaryoyu açıklayan açıklayıcı test isimleri kullanın
  • Daha iyi hata mesajları için assert! yerine assert_eq! tercih edin
  • Daha temiz hata çıktısı için Result döndüren testlerde ? kullanın
  • Testleri bağımsız tutun — paylaşılan mutable state yok

YAPMAYIN:

  • Result::is_err() test edebiliyorsanız #[should_panic] kullanmayın
  • Her şeyi mock'lamayın — mümkün olduğunda entegrasyon testlerini tercih edin
  • Kararsız testleri yok saymayın — düzeltin veya karantinaya alın
  • Testlerde sleep() kullanmayın — channel'lar, barrier'lar veya tokio::time::pause() kullanın
  • Hata yolu testini atlamayın

CI Entegrasyonu

# GitHub Actions
test:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        components: clippy, rustfmt

    - name: Check formatting
      run: cargo fmt --check

    - name: Clippy
      run: cargo clippy -- -D warnings

    - name: Run tests
      run: cargo test

    - uses: taiki-e/install-action@cargo-llvm-cov

    - name: Coverage
      run: cargo llvm-cov --fail-under-lines 80

Unutmayın: Testler dokümantasyondur. Kodunuzun nasıl kullanılması gerektiğini gösterirler. Onları net yazın ve güncel tutun.

Source repo
affaan-m/ECC
Skill path
docs/tr/skills/rust-testing/SKILL.md
Commit SHA
4e973d3eaf92
Repository license
MIT
Data collected