模糊测试
cargo-fuzz
cargo-fuzz 通过 libFuzzer 提供对模糊测试的支持。libFuzzer 是 LLVM 自带的库。
安装 cargo fuzz:
cargo install cargo-fuzz
在项目路径中初始化 fuzz:
cargo fuzz init
cargo-fuzz 会创建 fuzz 文件夹,需要模糊测试的文件以 bin 的形式添加到 fuzz/Cargo.toml 中即可:
[package]
name = "mypkg-fuzz"
version = "0.0.0"
authors = ["Automatically generated"]
publish = false
edition = "2018"
[package.metadata]
cargo-fuzz = true
[dependencies]
libfuzzer-sys = "0.4"
# Prevent this from interfering with workspaces
[workspace]
members = ["."]
[[bin]]
name = "serialize_string"
path = "fuzz_targets/serialize_string.rs"
test = false
doc = false
每个 bin 文件都是一个单独的 fuzz target。其内容为:
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
// do something
});
cargo-fuzz 命令
命令 | 作用 |
---|---|
cargo fuzz list | 列出可执行的 fuzz target。 |
cargo fuzz run <target> | 对 <target> 执行模糊测试 |
下面是一个实际的例子:
cargo fuzz run serialize_string -j8 -- -max_len=1440
性能测试
性能测试一般以 criterion.rs 为准。
将 criterion.rs 添加到 dev-dependencies 并添加 benchmark。
[dev-dependencies] criterion = { version = "0.4", features = ["html_reports"] } [[bench]] name = "my_benchmark" harness = false
在 benches 文件夹中添加 benchmark:
benchmark/my_benchmarkuse criterion::{black_box, criterion_group, criterion_main, Criterion}; fn fibonacci(n: u64) -> u64 { match n { 0 => 1, 1 => 1, n => fibonacci(n-1) + fibonacci(n-2), } } fn criterion_benchmark(c: &mut Criterion) { c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20)))); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches);
由于编译器的优化很可能导致无法准确测试出性能,所以可以使用 block_box 禁止编译器进行优化。