#proc-macro #test

assay

一款强大的 Rust 测试宏

2 个版本

0.1.1 2022年2月25日
0.1.0 2022年2月14日

#275 in 测试

Download history 407/week @ 2024-03-13 372/week @ 2024-03-20 282/week @ 2024-03-27 498/week @ 2024-04-03 382/week @ 2024-04-10 167/week @ 2024-04-17 334/week @ 2024-04-24 348/week @ 2024-05-01 241/week @ 2024-05-08 363/week @ 2024-05-15 285/week @ 2024-05-22 322/week @ 2024-05-29 188/week @ 2024-06-05 223/week @ 2024-06-12 180/week @ 2024-06-19 221/week @ 2024-06-26

870 每月下载次数
3 crates 中使用

MPL-2.0 许可证

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 testcargo nextest 运行测试,则会自动将每个测试作为单独的进程运行。这意味着您可以为每个进程状态进行任意修改,而不会影响其他测试,并且始终可以并行运行测试。
  • 设置每个进程的 env 变量
  • 为测试设置一个临时目录(类似于 chroot,但没有监狱方面的问题,也不需要 sudo 权限)
  • 通过指定文件将您想要的文件包含到临时目录中
  • 允许您通过在测试函数中添加 async 来运行异步测试
  • 使所有测试都表现得像返回 Result<(), Box<dyn std::error::Error>>。您可以使用 ?,无需为每个测试添加 Eye of Sauron (Ok(()))。
  • 自动导入 pretty_assertions 包,以便您可以为 assert_eqassert_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