testing - 为条件编译定义自定义属性的正确方法是什么?

标签 testing rust conditional-compilation

我希望能够将一个标志传递给 cargo test,以便在我需要调试测试时启用日志记录。

我想出了类似的东西:

#[cfg(logging)]
// An internal module where I define some helper to configure logging
// I use `tracing` internally.
use crate::logging;

#[test]
fn mytest() {
    #[cfg(logging)]
    logging::enable();
    // ..
    assert!(true);
}

然后我可以启用日志

RUSTFLAGS="--cfg logging" cargo test

它有效,但感觉就像我在滥用 rustc 标志系统。它还具有使用我的 logging 标志重新编译所有 crate 的副作用,如果有一天我的依赖项之一使用此标志(除了需要很长时间的事实),这可能会成为一个问题。

是否有更好的方法来定义和使用自定义属性?我可以在我的 cargo list 中添加一个功能,但这并不是真正的功能,因为它只是用于测试。

最佳答案

您通常不会重新编译您的应用程序,没有必要:您可以使用环境变量。例如:

if std::env::var("MY_LOG").is_ok() {
    logging::enable();
}

然后,您可以通过调用您的应用程序来动态决定记录

MY_LOG=true cargo run

或者,当已经编译时,

MY_LOG=true myapp

您通常不仅仅需要配置日志是否打开,例如日志级别或级别目标。这是一个真实的例子:https://github.com/Canop/broot/blob/master/src/main.rs#L20

关于testing - 为条件编译定义自定义属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60881384/

相关文章:

rust - Rust 中两个 float 与任意精度级别的比较

rust - 如何通过条件编译更改函数的限定符?

spring boot 测试错误的配置类

php - 解析 php 网络驱动程序中的错误

php - 使用 Laravel 进行正确的测试流程?

rust - 为什么在使用非文字模式时无法访问此匹配模式?

vector - 如何返回对添加到特征对象向量的具体类型的引用?

c# - 当最后一个方法调用是有条件的时,为什么 C# 编译器会删除一连串的方法调用?

c++ - #ifndef 如何在不同的文件中工作

java - 用于模拟的可编程 JDBC 驱动程序