ワンクリックで
csa-test-gen
Comprehensive test design for Rust projects following Core-first TDD and test pyramid principles
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Comprehensive test design for Rust projects following Core-first TDD and test pyramid principles
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when: full dev cycle branch->plan->implement->review->PR->merge
Use when: executing tasks via csa run/review/debate, session mgmt
Use when: iterative review-fix loop until csa review --diff is clean
Use when: running CSA-driven code review, independent model selection
Use when: three-layer manager-employee orchestration for delegation
Use when: legacy alias, redirects to dev2merge pipeline
| name | csa-test-gen |
| description | Comprehensive test design for Rust projects following Core-first TDD and test pyramid principles |
| allowed-tools | Bash, Read, Grep, Glob, Edit, Write |
Comprehensive test design for Rust projects following Core-first TDD and test pyramid principles.
Always test pure logic BEFORE UI:
1. Write pure logic in core/ or domain/ module
2. Write unit tests for core logic
3. Verify all tests pass
4. Only THEN implement UI layer
Target: 70% unit, 20% integration, 10% E2E
#[cfg(test)]
mod tests {
use super::*;
// Naming: test_<function>_<scenario>_<expected>
#[test]
fn test_parse_valid_input_returns_expected() {
// Arrange
let input = "valid_input";
// Act
let result = parse(input);
// Assert
assert_eq!(result, expected_value);
}
#[test]
fn test_parse_empty_input_returns_error() {
let result = parse("");
assert!(result.is_err());
}
}
| Category | Focus | Example |
|---|---|---|
| Happy Path | Typical valid input | parse("valid") -> Ok(value) |
| Boundary | Empty, null, min, max, +/-1 | parse("") -> Err(...) |
| Error | Invalid input, not found, denied | parse("@#$") -> Err(...) |
| Concurrent | Race conditions, deadlock | Multiple tasks with shared state |
// Define trait abstraction
pub trait UserRepository {
fn find(&self, id: &str) -> Option<User>;
}
// Test mock
#[cfg(test)]
struct MockUserRepository {
users: HashMap<String, User>,
}
#[cfg(test)]
impl UserRepository for MockUserRepository {
fn find(&self, id: &str) -> Option<User> {
self.users.get(id).cloned()
}
}
use proptest::prelude::*;
proptest! {
#[test]
fn prop_serialize_roundtrip(value in any::<MyType>()) {
let serialized = serde_json::to_string(&value).unwrap();
let deserialized: MyType = serde_json::from_str(&serialized).unwrap();
prop_assert_eq!(value, deserialized);
}
}
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
if let Ok(input) = std::str::from_utf8(data) {
let _ = parse(input); // Should never panic
}
});
#[tokio::test]