我正在开发一个使用 Rust 和 RocksDB 的项目,该项目在运行某些测试时创建数据库日志。每次运行测试时,都会再次创建路径并保存两者的信息。最终经过这么多次测试,会出现很多不必要的保存日志。
我的目标是在编译每个测试之前使用函数
std::fs::remove_dir_all
删除bd日志文件,这样每次都会有一个干净的石板来创建一个全新的db日志文件。
#[test]
pub fn it_deletes() -> std::io::Result<()> {
fs::remove_dir_all("relative path/.dblog")?;
Ok(())
}
当我制作上面所示的模拟测试函数并运行它时,不幸的是它不会删除该文件。但是,当我按“测试”选项旁边的“调试”(使用 vscode)时,它会成功删除该文件。然后,在调试控制台中我得到:
Console is in 'commands' mode, prefix expressions with '?'.
Launching: local debug path/it_deletes --exact --nocapture
Launched process 70701
Process exited with code 101.
此外,我在尝试运行货物测试时收到此错误。
---- it_deletes stdout ----
Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }
我是 Rust 的初学者,任何帮助将不胜感激!
您没有给我们一个可重现的示例,因此无法最终回答您提出的具体问题。不过,我确实有一些用于调试测试的一般性建议。
使用调试器。如果您通过 vscode 使用 rust-analyzer,那么您应该只需单击测试定义上方的“调试测试”按钮,如果您没有设置调试,我相信 vscode 会自动为您生成配置(您可能需要安装另一个扩展,也许是 lldb 扩展)。然后您可以设置断点并在执行期间检查测试的状态,包括整个调用堆栈。
为您想要检查的内容添加一些
println!
。当测试失败时,cargo test
将向您显示该测试的标准输出,以便您可以看到打印的内容(使用 vscode 测试设置运行也应该向您显示某个地方,但我不太熟悉告诉您的界面你到底在哪里)。在这种情况下,我要检查的是运行测试时的工作目录,以及您传递给 remove_dir_all
的目录路径,以便您可以检查它们是否合理。
您可以在测试代码中随意使用
expect
(或 unwrap
)。如果您对错误发生的确切位置感到恐慌,那么会更容易准确地看到错误的来源(而不是通过潜在的长链 Result
)。您还可以运行 RUST_BACKTRACE=1 cargo test
来获得有关恐慌的完整回溯,这可以帮助查明问题。
如果您的测试与文件系统交互,请给它们一个临时目录来使用。有像 tempfile 或 figment 这样的包可以帮助你做到这一点。这意味着您破坏您关心的文件的可能性要小得多,并且如果您自动生成临时目录(在某些操作系统管理的临时目录中,因此它最终会被清理),您可以不删除它事后您自己检查内容以进行调试。