3 个版本

使用旧的 Rust 2015

0.1.2 2018 年 10 月 10 日
0.1.1 2018 年 6 月 26 日
0.1.0 2018 年 3 月 1 日

#376 in 测试

Download history 15/week @ 2024-03-11 40/week @ 2024-03-18 9/week @ 2024-03-25 81/week @ 2024-04-01 1/week @ 2024-04-08 23/week @ 2024-04-15 49/week @ 2024-04-22 15/week @ 2024-04-29 2/week @ 2024-05-06 4/week @ 2024-05-20 10/week @ 2024-05-27 3/week @ 2024-06-03 22/week @ 2024-06-10 1/week @ 2024-06-17 30/week @ 2024-06-24

每月 下载 57
用于 mutagen-plugin

Apache-2.0/MIT

24KB
505

为了乐趣和利润破坏你的 Rust 代码

Build Status Downloads Version License

这是一个正在进行的诱变测试框架。不是所有组件都齐备,现有的也不完整,但现在已经可以某种程度上使用了。

诱变测试

诱变测试背后的想法是在你的代码中插入更改,以查看它们是否会使得测试失败。如果不会,那么显然你的测试未能测试更改后的代码。与行或分支覆盖率的不同之处在于,那些衡量的是被测试代码是否被 执行,但这并不能说明测试能否捕获任何错误。

这个仓库目前有三个组件:mutagen 测试运行器、一个辅助库和一个对代码进行诱变的进程宏。

mutagen 的工作原理

mutagen 作为一个进程宏工作。这意味着两件事

  1. 你需要一个 nightly rust 工具链来编译插件。
  2. 它只能看到你用 #[mutate] 注解标记的代码,没有更多。

它也只会看到裸 AST,没有推断类型,没有控制流或数据流,除非我们自行分析。但我们还希望它 快速。这意味着我们想要避免每次诱变都进行一次编译运行,所以我们尝试将所有诱变一次性嵌入代码中,并在运行时通过诱变计数来选择它们。这意味着我们必须避免破坏代码的诱变,使代码无法编译。

这个项目基本上是一个实验,看看在那些限制下我们还可以应用哪些诱变。

一个警告

mutagen 将会改变你使用 #[mutate] 属性注释的代码。只要你在安全代码中使用它,一切都会顺利进行。然而,对不安全代码运行 mutagen 很可能会打破它的不变性,造成可能的严重后果。因此,在任何情况下都不要在包含不安全代码的模块上运行 mutagen。

使用 mutagen

再次提醒,你需要一个 nightly 版本的 rustc 来编译插件。将插件和辅助库作为 dev-dependency 添加到你的 Cargo.toml

[dev-dependencies]
mutagen = "0.1.2"
mutagen-plugin = "0.1.2"

现在,你可以通过添加以下内容将插件添加到你的 crate 中:

#![cfg_attr(test, feature(plugin))]
#![cfg_attr(test, plugin(mutagen_plugin))]
#![feature(custom_attribute)]

#[cfg(test)]
extern crate mutagen;

现在,你可以通过添加以下内容来建议 mutagen 对任何函数、方法、impl、trait impl 或整个模块(但 不是 整个 crate,这是程序宏当前的限制)进行变异:

#[cfg_attr(test, mutate)]

这确保了变异只在测试模式下有效。

运行 mutagen

安装 cargo-mutagen。在测试的项目上运行 cargo mutagen

如果你想要开发版本,请在运行者目录中运行 cargo install

如果你想手动进行,你可以像往常一样运行 cargo test,这将变异你的代码,并在 target/mutagen/mutations.txt 中写入变异列表。对于每个变异,从 1 开始计数,你可以使用环境变量 MUTATION_COUNT=1 target/debug/myproj-123456MUTATION_COUNT=2 .. 等运行测试二进制文件。

你可以运行 cargo mutagen -- --coverage 来减少运行变异代码所需的时间。在运行此模式时,它会在过程开始时运行测试套件,并检查哪些测试触发了变异代码。然后,对于每个变异,它只执行受当前变异影响的测试,而不是再次运行整个测试套件。这种模式在测试套件较慢或变异代码只影响其中一小部分时特别有用。

贡献

欢迎问题和 PR!有关如何帮助的信息,请参阅 CONTRIBUTING.md

依赖项

~10KB