C++ 在运行时检测Catch2中的特定标记匹配

C++ 在运行时检测Catch2中的特定标记匹配,c++,c++14,catch-unit-test,catch2,C++,C++14,Catch Unit Test,Catch2,我的项目中有一些集成测试,这些测试依赖于正在建立的一些昂贵的全局状态。我只想在测试运行程序实际测试依赖它的系统时初始化该全局状态 我所做的似乎有效,但有点可怕。。。这取决于Catch配置中相当多的实现细节 以下是我的主要观点: #define CATCH_CONFIG_RUNNER #include "catch.hpp" ... int main(int argc, const char* argv[]) { // Construct a fake TestCas

我的项目中有一些集成测试,这些测试依赖于正在建立的一些昂贵的全局状态。我只想在测试运行程序实际测试依赖它的系统时初始化该全局状态

我所做的似乎有效,但有点可怕。。。这取决于Catch配置中相当多的实现细节

以下是我的主要观点:

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
...

int main(int argc, const char* argv[])
{
    // Construct a fake TestCaseInfo to match against the [integration] tag
    const char * expensive_tag = "integration";
    Catch::SourceLineInfo fake_source_line("?", 0)
    Catch::TestCaseInfo fake_test_case("?", "?", "?", {expensive_tag}, fake_source_line);

    Catch::Session session;
    session.applyCommandLine(argc, argv);
    auto test_spec = session.config().testSpec();
    const bool want_integration_tests = test_spec.matches(fake_test_spec);

    if(want_integration_tests)
    {
        do_expensive_setup();
    }
    
    return session.run();
}
然后我的测试文件就是:

#include "catch.hpp"
...

TEST_CASE("expensive-to-initialize system", "[.integration]")
{
    REQUIRE(expensive_setup_is_done());

    SECTION("has property 1") { ... }
    SECTION("has property 2") { ... }
    ...
}
请注意,因为在我的实际项目中,有多个部分和多个依赖于全局设置的测试用例,所以我不能将初始化移到测试用例的顶部


有更好的方法吗?

只需按需进行初始化,使用以下方法:

测试初始化系统,[.集成] { 静态std::once_标志init_标志; std::调用onceinit标志,进行设置; // ... } 这将确保一次性调用do_安装程序,但仅在需要时调用。如果有多个地方需要此设置,只需将其包装在函数中即可


请注意,如果do_昂贵的安装程序抛出,则可能会再次调用它。但一旦函数成功退出,就到此为止。

只需按需进行初始化,使用如下方法:

测试初始化系统,[.集成] { 静态std::once_标志init_标志; std::调用onceinit标志,进行设置; // ... } 这将确保一次性调用do_安装程序,但仅在需要时调用。如果有多个地方需要此设置,只需将其包装在函数中即可


请注意,如果do_昂贵的安装程序抛出,则可能会再次调用它。但一旦函数成功退出,就到此为止。

哦,哇,我一次都不知道std::call\u。太好了!将静态常数布尔虚拟=执行昂贵的设置,错误;还工作吗?有些人可能会觉得它更难看,但我并不介意,因为我知道静力学是如何工作的。@nosensetal是的,将缺失的参数模化后,它也能正常工作。噢,哇,我不知道std::call_一次。太好了!将静态常数布尔虚拟=执行昂贵的设置,错误;还工作吗?有些人可能会觉得它更难看,但我并不介意,因为我知道静力学是如何工作的。@nosensetal是的,将缺失的parens模化,这也很好。