Back to list
aiskillstore

testing

by aiskillstore

Security-audited skills for Claude, Codex & Claude Code. One-click install, quality verified.

102🍴 3📅 Jan 23, 2026

SKILL.md


name: testing description: Comprehensive testing strategies for Guts including unit tests, integration tests, property-based testing, and fuzzing

Testing Skill for Guts

You are writing tests for a distributed system that requires high reliability.

Testing Pyramid

        /\
       /  \      E2E Tests (few)
      /    \     Integration Tests (some)
     /      \    Unit Tests (many)
    /________\   Property Tests (extensive)

Unit Testing

Structure

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

    // Group related tests
    mod repository_tests {
        use super::*;

        #[test]
        fn create_repository_success() {
            let repo = Repository::new("test-repo");
            assert_eq!(repo.name(), "test-repo");
        }

        #[test]
        fn create_repository_invalid_name() {
            let result = Repository::new("");
            assert!(matches!(result, Err(RepositoryError::InvalidName(_))));
        }
    }
}

Async Tests

#[tokio::test]
async fn async_operation_completes() {
    let service = TestService::new().await;

    let result = tokio::time::timeout(
        Duration::from_secs(5),
        service.long_running_operation(),
    )
    .await;

    assert!(result.is_ok());
}

Integration Testing

Test Fixtures

// tests/common/mod.rs
pub struct TestNode {
    pub node: Node,
    pub temp_dir: TempDir,
}

impl TestNode {
    pub async fn new() -> Self {
        let temp_dir = TempDir::new().unwrap();
        let config = Config::test_default(temp_dir.path());
        let node = Node::new(config).await.unwrap();

        Self { node, temp_dir }
    }
}

// tests/integration/repository_tests.rs
#[tokio::test]
async fn can_create_and_clone_repository() {
    let node = TestNode::new().await;

    // Create repository
    let repo_id = node.create_repository("test").await.unwrap();

    // Clone should succeed
    let cloned = node.clone_repository(repo_id).await;
    assert!(cloned.is_ok());
}

Multi-Node Tests

#[tokio::test]
async fn nodes_sync_repository() {
    // Start 3 nodes
    let nodes: Vec<_> = futures::future::join_all(
        (0..3).map(|_| TestNode::new())
    ).await;

    // Connect nodes
    for i in 1..nodes.len() {
        nodes[i].connect_to(&nodes[0]).await.unwrap();
    }

    // Create repo on node 0
    let repo_id = nodes[0].create_repository("sync-test").await.unwrap();

    // Wait for sync
    tokio::time::sleep(Duration::from_secs(2)).await;

    // Verify all nodes have the repo
    for node in &nodes {
        assert!(node.has_repository(repo_id).await);
    }
}

Property-Based Testing

Using proptest:

use proptest::prelude::*;

proptest! {
    #[test]
    fn repository_name_roundtrip(name in "[a-z][a-z0-9-]{0,63}") {
        let repo = Repository::new(&name).unwrap();
        prop_assert_eq!(repo.name(), name);
    }

    #[test]
    fn signature_verification(data in any::<Vec<u8>>()) {
        let identity = Identity::new();
        let signature = identity.sign(&data);
        prop_assert!(identity.verify(&data, &signature).is_ok());
    }
}

Fuzzing

Using cargo-fuzz:

// fuzz/fuzz_targets/parse_message.rs
#![no_main]
use libfuzzer_sys::fuzz_target;
use guts_protocol::Message;

fuzz_target!(|data: &[u8]| {
    // Parsing should never panic
    let _ = Message::parse(data);
});

Test Commands

# Run all tests
cargo test --workspace

# Run with coverage
cargo llvm-cov --workspace --html

# Run specific test
cargo test repository_tests::create_repository

# Run integration tests only
cargo test --test '*' --workspace

# Run benchmarks
cargo bench --workspace

# Run fuzzer
cargo +nightly fuzz run parse_message

CI Test Matrix

test:
  strategy:
    matrix:
      os: [ubuntu-latest, macos-latest]
      rust: [stable, beta, nightly]
  steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@master
      with:
        toolchain: ${{ matrix.rust }}
    - run: cargo test --workspace --all-features

Mocking Dependencies

use mockall::automock;

#[automock]
pub trait Storage {
    async fn get(&self, key: &[u8]) -> Result<Vec<u8>>;
    async fn put(&self, key: &[u8], value: &[u8]) -> Result<()>;
}

#[tokio::test]
async fn service_uses_storage() {
    let mut mock = MockStorage::new();
    mock.expect_get()
        .returning(|_| Ok(vec![1, 2, 3]));

    let service = Service::new(Box::new(mock));
    let result = service.fetch_data(b"key").await;

    assert_eq!(result.unwrap(), vec![1, 2, 3]);
}

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

+5
最近の活動

1ヶ月以内に更新

+10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

Reviews

💬

Reviews coming soon