C++ 在运行时检测Catch2中的特定标记匹配
我的项目中有一些集成测试,这些测试依赖于正在建立的一些昂贵的全局状态。我只想在测试运行程序实际测试依赖它的系统时初始化该全局状态 我所做的似乎有效,但有点可怕。。。这取决于Catch配置中相当多的实现细节 以下是我的主要观点: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
#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模化,这也很好。