2 个版本
0.1.1 | 2022年2月25日 |
---|---|
0.1.0 | 2022年2月14日 |
#275 in 测试
870 每月下载次数
在 3 crates 中使用
13KB
72 代码行
assay - 一款强大的 Rust 测试宏
as·say /ˈaˌsā,aˈsā/ 名词 - 对金属或矿石进行试验,以确定其成分和品质。
Rust 语言很棒,但有时测试功能还有待完善。由于自定义测试框架不稳定,且自2018年以来只有eRFC,我们很难扩展测试功能,对吧?那么,这就是assay
出现的地方。它旨在解决 Rust 测试中的几个问题
- 所有测试都在同一个进程中运行,这意味着设置环境变量或更改工作目录会影响所有测试,因此你必须求助于像
cargo test -- --test-threads=1
这样的方法,或者使用某种互斥锁,这会导致你失去并行运行测试套件的能力 - 设置临时文件系统以运行测试,并在其中运行测试,设置起来很麻烦,并且使用
std::env::set_working_dir
设置工作目录很容易遇到上述问题 - 在测试中包含设置,更不用说多个设置了,会变得有点冗长
- 为每个测试设置和拆除相同的东西会花费很多时间
- 想要运行
async
测试吗?没有运行时,你不得不进行设置才能运行它。 - 在测试中使用
?
意味着在每次测试中都放置-> Result<(), Box<dyn std::error::Error>>
,这可能会很繁琐 assert_eq
/assert_ne
的输出可能难以理解,难以看到为什么某物相等或不相等
assay
通过以下方式解决这些问题:
- 如果您使用
cargo test
或cargo nextest
运行测试,则会自动将每个测试作为单独的进程运行。这意味着您可以为每个进程状态进行任意修改,而不会影响其他测试,并且始终可以并行运行测试。 - 设置每个进程的 env 变量
- 为测试设置一个临时目录(类似于
chroot
,但没有监狱方面的问题,也不需要sudo
权限) - 通过指定文件将您想要的文件包含到临时目录中
- 允许您通过在测试函数中添加
async
来运行异步测试 - 使所有测试都表现得像返回
Result<(), Box<dyn std::error::Error>>
。您可以使用?
,无需为每个测试添加 Eye of Sauron (Ok(())
)。 - 自动导入
pretty_assertions
包,以便您可以为assert_eq
和assert_ne
获得格式化的输出 - 允许您定义设置和清理函数以在测试中调用
assay
诞生于个人对当前事情方式的挫败感,以及在没有编写整个测试框架的情况下处理样板代码的愿望,同时也在推动我们在稳定 Rust 上的能力极限。
限制
虽然 assay
目前功能强大,但它并非没有问题
- 测试在它们的进程中运行,因此以良好的方式提供输出仍然是一个未解决的问题
- 有时不应该通过测试的测试通过了,至少在开发
assay
时是这样,因为它们在另一个进程中运行。您应该有意崩溃您的测试以确认它确实在工作,因为您将会有一些测试通过,实际上不应该通过,这并不好 - Rust Analyzer 有时会遇到麻烦,错误会传播到每个调用,这使得跟踪更困难。在这种情况下,
cargo test
将会告诉您问题实际上在哪里 - 还没有对 spans 进行工作!这个宏只是简单地添加东西,所以错误信息仍然有很多需要改进的地方,以便告诉您为什么
assay
的调用失败。 assay
不适用于文档测试!
如何使用 assay
请参阅 HOW_TO_USE.md
(该文件包含在包文档中)或 tests/integration_tests.rs
。
MSRV 政策
我们没有最低支持的 Rust 版本,只跟踪 stable
。鉴于这个包使用 2021 版本的 rustc
>= 1.56,但目前这并不总是保证,以后的版本可能需要比 1.56 更高的版本。
许可证
本项目中所有文件均采用Mozilla公共许可证第2.0版进行分发。您可以在以下链接中阅读许可证条款:LICENSE.txt
。
依赖项
~5-15MB
~193K SLoC