rust 如何为集成测试初始化记录器?

omqzjyyz  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(187)

我在src目录下有一个生产代码的机箱,在tests目录下有一个集成测试。
我想在运行集成测试时初始化一个全局记录器(例如env_logger::init().unwrap();)。有几个测试,但测试顺序未定义,因此我不知道应该在哪个测试中放置初始化命令。
有没有什么方法可以很好地完成这个任务?也许可以通过覆盖testsmain函数?

g6ll5ycj

g6ll5ycj1#

您可以使用类似于以下的代码:

use std::sync::Once;

static INIT: Once = Once::new();

/// Setup function that is only run once, even if called multiple times.
fn setup() {
    INIT.call_once(|| {
        env_logger::init().unwrap();
    });
}

然后在每次测试开始时简单地调用setup()
最初基于this blogpost

hrirmatl

hrirmatl2#

最新的文档中有一个关于在测试中捕获日志的建议:环境记录器:
默认情况下,测试工具不会捕获在货物测试期间记录的记录。可以在单元测试中使用Builder::is_test方法,以确保捕获日志:


# [cfg(test)]

mod tests {
    fn init() {
        let _ = env_logger::builder().is_test(true).try_init();
    }

    #[test]
    fn it_works() {
        init();
        info!("This record will be captured by `cargo test`");

        assert_eq!(3, 1 + 2);
    }
}
siotufzp

siotufzp3#

现在,你可以在每次测试开始时重新初始化记录器,忽略错误。这不是一个很好的解决方案,但它是有效的,而且非常安全。

let _ = env_logger::init();

// your test code...
8iwquhpp

8iwquhpp4#

除了Danilo Bargen的评论之外,你还可以用更短的形式来写:

use std::sync::Once;

static INIT: Once = Once::new();

fn setup() {
  INIT.call_once(env_logger::init);
}

相关问题