如何使用GoogleTest在CMake项目中运行特定测试?

问题描述 投票:0回答:1

项目概况:

我目前正在开发一个 C++ 项目,其中包含我想要测试的多个内容,并且我正在使用 GoogleTest 进行单元测试。我的项目结构看起来像这样:

project/
│
├── CMakeLists.txt
├── src/
│   ├── thing1.cpp
│   ├── thing2.cpp
│   └── other_thigns.cpp
└── tests/
    ├── CMakeLists.txt
    ├── thing1Tests.cpp
    ├── thing2Tests.cpp
    └── other_thingsTests.cpp

现状:

我已经在测试目录中设置了 CMakeLists.txt,将所有测试文件编译为单个测试可执行文件,并使用 GoogleTest 的测试发现机制运行它们。这是我的 CMakeLists.txt 的简化版本:

cmake_minimum_required(VERSION 3.16.3)

include(GoogleTest)

set(This tests)

set(Sources
    thing1.cpp
    thing2.cpp
    # Other test files
)

add_executable(${This} ${Sources})

target_link_libraries(${This} PRIVATE
    GTest::gtest_main
    Project
)

add_test (
    NAME ${This}
    COMMAND ${This}
)

gtest_discover_tests(${This})

目前在 VScode 中,当我点击左下角的“运行”按钮时,它会运行指定“源”中的所有测试。随着这个项目的发展,测试其中一部分会变得非常乏味。

期望的改进:

我想通过允许在测试目录中执行特定的 *test.cpp 文件来增强我的测试设置。这将提供对测试的更好控制,并有助于在进行更改时进行有针对性的测试。

理想情况下,它是一个带有带有参数的选项的命令,并且能够过滤我想要使用该参数运行的测试。

问题:

目前我还没有找到一种方法可以做到这一点。这是我尝试添加到上面的 CMakeList 中的一种方法:

# Define an option to specify the tests to run
option(RUN_SPECIFIC_TESTS "Run specific tests using --gtest_filter" OFF)

# Specify the tests to run using a command-line argument
if(RUN_SPECIFIC_TESTS)
    set(TEST_PREFIX "thing1") # Default test prefix, change as needed
    add_custom_target(run_specific_tests
        COMMAND ${This} --gtest_filter=${TEST_PREFIX}*
        DEPENDS ${This}
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    )
endif()

我尝试运行的命令是:

cmake --build . --target run_specific_tests -DRUN_SPECIFIC_TESTS=ON -DTEST_PREFIX=thing2

我理想中想要发生的事情:

我正在寻找一种解决方案,使我能够使用命令行参数或类似方法指定要运行的测试。例如,我想通过运行上面的命令来仅执行“thing2”测试。

我需要有关如何在现有的 CMake 和 GoogleTest 设置中有效实施此解决方案的指导。具体来说,我需要帮助修改我的 CMakeLists.txt 以允许基于命令行参数执行特定测试。任何有关如何实现这一目标的见解或示例将不胜感激。

编辑 正如其他人指出的那样,这个问题类似于如何在 GoogleTest 中运行特定的测试用例。正如您在我的问题部分中看到的那样,我试图遵循我可以做到的。但由于我是 CMake 新手,我可能错过了一些东西。

c++ cmake googletest cmakelists-options
1个回答
0
投票

我认为这个问题不必要地复杂。我没有尝试运行依赖于其 *Tests.cpp 的测试,而是找到了这篇文章:GoogleTest 的高级选项。这只是允许我使用选项

 --gtest_filter=
来按测试套件名称进行过滤。

这意味着开发人员需要知道套件名称,并且我们需要标准化测试的命名方式。但这不是问题,并且不需要更改代码。

如果您遇到同样的问题,“当前情况”部分中的 CMakeList.txt 正是我所拥有的,运行特定测试的命令是:

  • 运行所有测试:
    ./(YOUR TEST DIRECTORY) --gtest_filter=*
  • 运行特定测试:
    ./(YOUR TEST DIRECTORY) --gtest_filter=(standard prefix suite name)*

例如,在我的

thing2.cpp
中运行特定测试,其中的测试可能是:

//thing2.cpp

TEST(sample_test1_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

TEST(sample_test2_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

因此运行此命令的命令是:

./(YOUR TEST DIRECTORY) --gtest_filter=sample_test*
。此命令将在
thing2.cpp
中运行这两个测试。如果您只想运行其中一项测试,您的命令可能如下所示:例如,
./(YOUR TEST DIRECTORY) --gtest_filter=sample_test2*

使用这种方法,您只需要更加谨慎地命名测试套件名称。

© www.soinside.com 2019 - 2024. All rights reserved.