我有一个Rust函数,panic
在某种情况下会出错,我想写一个测试用例来验证这个函数是否会出错。除了assert!
和assert_eq!
宏之外,我找不到任何东西。有什么机制可以测试这个吗?
我可以生成一个新任务,然后检查该任务是否会出现混乱。这样做有意义吗?
返回一个Result<T, E>
不适合我的情况。
我希望在我实现的Matrix
类型中添加对Add
特征的支持。
let m = m1 + m2 + m3;
其中,m1
、m2
、m3
都是矩阵。因此,add
的结果类型应为Matrix
。类似于以下内容的结果类型太过晦涩:
let m = ((m1 + m2).unwrap() + m3).unwrap()
与此同时,add()
函数需要验证两个相加的矩阵是否具有相同的维数。因此,如果维数不匹配,add()
需要紧急处理。可用的选项是panic!()
。
8条答案
按热度按时间lvjbypge1#
你可以在Rust一书的testing部分找到答案。更具体地说,你需要
#[should_panic]
属性:yvfmudvl2#
正如弗朗西斯Gagné在他的回答中提到的,我还发现
#[should_panic]
属性对于更复杂的测试来说不够细粒度--例如,如果我的测试设置由于某种原因失败了(例如,我编写了一个糟糕的测试),我 * 确实 * 希望一个恐慌被认为是失败!从Rust 1.9.0开始,
std::panic::catch_unwind()
已经可用,它允许你把你预期会死机的代码放到闭包中,只有 * 那个 * 代码发出的死机才会被认为是预期的(即通过测试)。请注意,它无法捕获非展开死机(例如
std::process::abort()
)。5anewei63#
如果你想Assert测试函数的特定部分失败,使用
std::panic::catch_unwind()
并检查它是否返回Err
,例如is_err()
。在复杂的测试函数中,这有助于确保测试不会因为早期的失败而错误地通过。Rust标准库中的Severaltests本身使用此技术。
wnvonmuf4#
使用以下
catch_unwind_silent
而不是常规catch_unwind
,可在预期异常的输出中实现静默:pdtvr36n5#
作为附录:@U007D提出的解决方案也适用于doctests:
vsaztqbk6#
使用
#[should_panic]
属性的公认答案的主要问题是:作为更好的替代方案,我强烈建议查看名为fluent-asserter的库
通过使用它,您可以轻松地编写一个Assert来检查是否发生了死机,如下所示:
这样做的好处是:
hjzp0vay7#
来自单元测试文档中的“测试恐慌”部分
运行
cargo test
时的输出为wsewodh28#
当使用 rust 板条箱
test_case
时,使用panics
习语。