$ loading_
帮助你按TDD方法编写Rust单元、集成、异步与属性测试。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "rust-testing" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/skills/rust-testing/SKILL.md 2. 保存为 ~/.claude/skills/rust-testing/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为这个 Rust 函数编写完善的单元测试,覆盖正常输入、边界条件和错误分支,并解释每个测试的意图:
rust
pub fn parse_port(s: &str) -> Result<u16, String> {
let port: u16 = s.parse().map_err(|_| "invalid number".to_string())?;
if port == 0 {
return Err("port must be > 0".to_string());
}
Ok(port)
}
返回可运行的 Rust 单元测试代码,包含多个断言用例与测试说明。
我有一个使用 tokio 和 reqwest 的 Rust API 客户端。请给我一个集成测试方案,包含异步测试结构、测试服务器模拟方式、成功/失败响应验证,以及如何组织 tests 目录。
提供异步集成测试示例、目录结构建议,以及模拟服务与断言策略。
请为一个 Rust 命令行工具制定 TDD 测试策略,涵盖先写失败测试、最小实现、重构步骤,并加入属性测试、mock 与覆盖率检查建议。
输出分阶段的测试流程、推荐工具链,以及适合持续集成的实践清单。
TDD方法論に従って信頼性が高く保守しやすいテストを書くための包括的なRustテストパターン。
#[cfg(test)] モジュール内で #[test] を使用、rstest でパラメータ化テスト、または proptest でプロパティベーステストRED → まず失敗するテストを書く
GREEN → テストを通過する最小限のコードを書く
REFACTOR → テストを通過したままコードをリファクタリングする
REPEAT → 次の要件に進む
// 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
// 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", "[email protected]").unwrap();
assert_eq!(user.display_name(), "Alice");
assert_eq!(user.email, "[email protected]");
}
#[test]
fn rejects_invalid_email() {
let result = User::new("Bob", "not-an-email");
assert!(result.is_err());
assert!(result.unwrap_err().contains("invalid email"));
}
}
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
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
}
#[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];
}
my_crate/
├── src/
│ └── lib.rs
├── tests/ # 統合テスト
│ ├── api_test.rs # 各ファイルが独立したテストバイナリ
│ ├── db_test.rs
│ └── common/ # 共有テストユーティリティ
│ └── mod.rs
// 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");
}
#[tokio::test]
async fn fetches_data_successfully() {
…
帮助开发者为代码代理配置性能优化、安全防护与研究优先工作流。
提供数据库迁移、回滚与零停机发布的最佳实践指导,适用于多种 ORM 与 SQL 数据库。
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
帮助你掌握地道 Rust 模式、所有权与并发实践,编写安全高性能应用。
基于 C++ Core Guidelines 编写、审查并重构更安全现代的 C++ 代码。
为 Claude Code 会话提供系统化校验流程,帮助检查结果正确性与质量。
帮助你系统掌握 Rust 测试模式与 TDD 实践,提升代码质量与可维护性。
帮助你系统掌握 Rust 测试模式,并用 TDD 提升代码质量与覆盖率。
帮助用户掌握 Rust 惯用模式、所有权与并发实践,构建安全高性能应用。
帮助开发者用 Kotest、MockK 与协程测试构建高质量 Kotlin 测试体系。
帮助你设计并实现基于pytest与TDD的高质量Python测试策略。
提供 Kotlin 测试模式与 TDD 实践,涵盖 MockK、协程测试、性质测试和覆盖率分析。