Rust代码突变测试工具cargo-mutants的使用,提升Rust项目测试覆盖率与代码质量
Rust代码突变测试工具cargo-mutants的使用,提升Rust项目测试覆盖率与代码质量
cargo-mutants是一个帮助提升Rust程序质量的工具,它能发现代码中可以插入错误但不会导致测试失败的位置。
功能概述
覆盖率测量虽然有用,但它们只能告诉你哪些代码被测试覆盖,并不能说明测试是否真正检查了代码的行为。突变测试提供了不同的信息,它能告诉你测试是否真的检查了代码的行为。
cargo-mutants的目标是:
- 在任何Rust源代码树中都能轻松运行
- 告诉你那些可能存在bug或测试不足的区域的有趣信息
安装
cargo install --locked cargo-mutants
快速开始
在Rust源代码目录中运行:
cargo mutants
如果只想对特定文件生成突变:
cargo mutants -f src/something.rs
示例Demo
下面是一个完整的示例,展示如何使用cargo-mutants来测试一个简单的Rust项目:
- 首先创建一个简单的Rust项目:
cargo new mutant_demo
cd mutant_demo
- 添加一些测试代码到src/lib.rs:
// 计算两个数的和
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
// 计算两个数的乘积
pub fn multiply(a: i32, b: i32) -> i32 {
a * b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
}
#[test]
fn test_multiply() {
assert_eq!(multiply(3, 3), 9);
}
}
- 安装cargo-mutants并运行测试:
cargo install --locked cargo-mutants
cargo mutants
cargo-mutants会尝试修改(add函数中的a + b
可能会被改为a - b
等),然后运行测试来检查这些修改是否会被测试发现。
- 如果测试没有覆盖所有情况,cargo-mutants会报告哪些突变没有被测试捕获,例如:
Found 4 mutants to test
Testing mutant in src/lib.rs:3: replace `a + b` with `a - b`
✓ Caught by test_add
Testing mutant in src/lib.rs:8: replace `a * b` with `a + b`
✗ Not caught by any test
这表明我们的测试没有覆盖当乘法函数被错误地改为加法的情况。
完整示例
下面是一个更完整的示例,展示如何改进测试以覆盖所有突变情况:
// 计算两个数的和
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
// 计算两个数的乘积
pub fn multiply(a: i32, b: i32) -> i32 {
a * b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
assert_eq!(add(0, 0), 0); // 测试边界情况
assert_eq!(add(-1, 1), 0); // 测试负数情况
}
#[test]
fn test_multiply() {
assert_eq!(multiply(3, 3), 9);
assert_eq!(multiply(0, 5), 0); // 测试乘以0的情况
assert_eq!(multiply(-2, 3), -6); // 测试负数乘法
}
}
改进后的测试现在能捕获更多潜在的突变,提高了测试覆盖率。
项目状态
截至2025年1月,这是一个积极维护的业余项目。预计每1-2个月会发布一次版本。
该软件"按原样"提供,不提供任何形式的担保。
1 回复