在所有测试运行完成后,有没有一种方法执行一个拆卸函数?

29
在Rust中,是否有一种方法可以使用标准测试库在所有测试运行完成后(即在cargo test结束时)执行一个拆卸函数? 我不想在每个测试之后运行拆卸函数,因为这些相关帖子已经讨论过:它们讨论了以下内容: 这些讨论了以下想法: 一种解决方法是编写一个包装cargo test调用的 shell 脚本,但我仍然很想知道上述是否可行。

我尝试过了,但无法使其正常工作。类似于这个,也许可以吗? - Ivan Gozali
你可以像 build.rs 一样编写一个脚本,可能需要配置一个配置文件。 - Stargateur
2
你是正确的,静态变量不会运行析构函数 - 请参见 https://dev59.com/YKjka4cB1Zd3GeqPGve_。 - Sven Marnach
6
已有一项被接受的实验性RFC允许使用自定义测试框架-请参见此跟踪问题。这将允许更多关于测试的灵活性,但不幸的是目前在此方面仍没有太多进展。 - Sven Marnach
像 @SvenMarnach 一样,我认为除非实现这个 RFC,否则没有解决这个问题的方法。如果您使用夜间编译器,则可以使用已经实现的少数功能。据我所知。 - Boiethios
人们经常使用trybuild(https://docs.rs/trybuild/1.0.18/trybuild/)来测试过程宏,我相当确定你实际上可以将这个crate应用于任何用例,甚至是自定义测试框架。也许如果有人在此基础上构建了这样的东西,上述RFC甚至可能会向前推进? - user11877195
2个回答

3
我不确定Rust内置测试功能是否有全局(“会话”)拆卸的方法,除了“可能是一个构建脚本”,以前的查询似乎没有得到很好的结果。第三方测试系统(例如shiny或stainless)可能具有该选项,值得研究其确切功能。
另外,如果夜间适合,正在实现自定义测试框架功能您可以尝试用于此目的
除此之外,您可能需要查看macro_rules!来清理一些样板文件,这就是像burntsushi这样的人所做的{{link4:例如在正则表达式包中}}。

2
当链接到“之前的查询几乎没有结果”时,您链接到了这个问题。 - alextes

2
这是Masklinn提到的自定义测试框架解决方案的示例实现。
#![feature(custom_test_frameworks)]
#![feature(test)]
#![test_runner(custom_test_runner)]

extern crate test;

use test::{test_main_static, TestDescAndFn};

fn main() {}

pub fn custom_test_runner(tests: &[&TestDescAndFn]) {
    println!("Setup");
    test_main_static(tests);
    println!("Teardown");
}

#[cfg(test)]
mod tests {

    #[test]
    fn test1() {
        println!("Test 1")
    }

    #[test]
    fn test2() {
        println!("Test 2")
    }
}

这将打印:

Setup
Test 1
Test 2
Teardown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接