我正在做一个使用Rust和RocksDB的项目,当运行某些测试时,它会创建一个db日志。每次运行测试时,都会再次创建路径,并保存两者的信息。最后经过这么多次测试,会有很多不必要的保存日志。
我的目标是使用函数std::fs::remove_dir_all
在每次测试编译之前删除bd日志文件,这样每次都可以创建一个全新的db日志文件。
#[test]
pub fn it_deletes() -> std::io::Result<()> {
fs::remove_dir_all("relative path/.dblog")?;
Ok(())
}
当我创建一个上面显示的模拟测试函数并运行它时,不幸的是它没有删除文件。但是当我按下按钮时,旁边的Test选项(使用vscode)成功删除了文件。然后,在Windows Console中,我得到:
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 ,任何帮助将不胜感激!
1条答案
按热度按时间kkbh8khc1#
你没有给我们一个可重复的例子,所以不可能对你提出的具体问题做出结论性的回答。但是,我确实有一些调试测试的一般性建议。
1.使用调试器。如果你通过vscode使用rust-analyzer,那么你应该可以点击测试定义上方的“调试测试”按钮,如果你没有调试设置,我相信vscode会自动为你生成配置(你可能需要安装另一个扩展,也许是lldb扩展)。然后,您可以设置断点并在执行期间检查测试的状态,包括整个调用堆栈。
1.对于你想检查的东西,再加上一些
println!
。当一个测试失败时,cargo test
会显示该测试的标准输出,这样你就可以看到你打印的内容了(运行vscode测试设置也应该会在某个地方显示出来,但是我不太熟悉这个接口,所以不能告诉你具体的位置)。在本例中,我检查的是运行测试时的工作目录,以及传递给remove_dir_all
的目录路径,因此您可以检查它们是否合理。1.在测试代码中可以随意使用
expect
(或unwrap
)。如果您在错误发生的确切位置发生恐慌,那么将更容易看到错误的确切来源(而不是通过潜在的一长串Result
)。您还可以运行RUST_BACKTRACE=1 cargo test
来获取有关恐慌的完整回溯,这可以帮助确定问题。1.如果您的测试与文件系统交互,那么给予一个临时目录供它们使用。有像tempfile或figment这样的板条箱可以帮助您做到这一点。这意味着你不太可能破坏你关心的文件,如果你正在自动生成一个临时目录(在一些操作系统管理的临时目录中,所以它最终会被清理),你可以不删除它,而是在事后检查内容以进行调试。