将 GoogleTest 设置为 运行 一个可执行文件中的所有测试

Setting up GoogleTest to run all tests in one executable

在设置我最近的项目时,我尝试使用 GoogleTest。目前我有这个:

macro(add_test_l TEST_NAME)

    # Create the executable and use the last arguments as source files.
    add_executable(${TEST_NAME} ${ARGN})

    # Link in the AMR and gtest libraries.
    target_link_libraries(${TEST_NAME}
        ${PROJECT_NAME}
        gtest
        gmock
        gtest_main
    )

    # Add the test to gtest.
    add_test(
        NAME ${TEST_NAME}
        COMMAND ${TEST_NAME}
    )

    list(APPEND TEST_SOURCE_FILES ${ARGN})

endmacro()

然后我可以添加像 add_test_l(Element Sets/Element.test.cpp) 这样的测试,它既有效又方便。但这当然会为每个测试创建一个可执行文件,这并不是一件坏事,因为它允许对单个文件进行快速测试。

虽然我确实希望能够 运行 使用单个 exe 进行所有测试(这样 CI 会更容易)所以我在宏的末尾添加了该列表并添加了我所有的个人测试:

add_executable(all_tests ${TEST_SOURCE_FILES})
target_link_libraries(all_tests
    ${PROJECT_NAME}
    gtest
    gmock
    gtest_main
)

它为 运行 我所有的测试用例创建了一个 EXE。

这似乎效率不高,因为我将所有文件都编译了两次。有没有更好的方法让我达到预期的结果?也许我可以添加一个选项来启用/禁用个人与所有测试 exes。

没有必要每个文件都有一个可执行文件。为所有测试构建一个可执行文件并学习 gtest 选项 --gtest_filter。您可以 运行 每个单独测试:

all_tests --gtest_filter=Element.Test

或者您可以 运行 所有元素测试,就像宏 add_test_l 那样:

all_tests --gtest_filter=Element.*

提供了有关命令行选项的更多信息:

all_tests --help

有用的命令之一:

all_tests --gtest_list_tests