Visual Studio 2019 测试资源管理器未找到 c++ google 测试

Visual Studio 2019 Test Explorer did not find c++ google tests

我希望在 VS 2019 测试资源管理器中显示 google 测试中编写的 c++ 单元测试。

测试设置正确,可以执行。结果显示在VS调试console/commandline-likewindow。除了测试相关消息之外,没有显示任何错误消息。 我想从测试资源管理器开始测试并创建测试播放列表。

我安装了 VS Installer 提供的 google 测试适配器。我遵循了 TestAdapterForGoogleTest.

中的指南和建议的故障排除

是否存在另一种方法可以让 google 测试显示在测试资源管理器中? google 测试和 VS 测试资源管理器还有哪些其他已知的不兼容性?

我遇到了和你一样的问题。我在子目录中有一个主要的 CMakeLists.txt 和另外两个 CMakeLists.txt 文件:一个用于静态库我正在测试,其中一个用于测试项目本身。 为了确保测试出现在 Test Explorer 中,我不得不将 enable_testing() 从测试子目录移动到主 CMakeLists.txt.

option(MY_PROJECT_TESTS "Build unit tests" ON)

if(MY_PROJECT_TESTS)
    enable_testing()
    add_subdirectory("test")
endif()

然后在测试子目录中,我正在设置GoogleTest环境,并通过以下方式添加测试:

set(GTEST_DIR "googletest/googletest" CACHE PATH "gtest directory")
include(GoogleTest)
set(gtest_force_shared_crt OFF CACHE BOOL "" FORCE)
add_subdirectory("googletest")

project(My_project_test)

if (WIN32)
    add_library(qtpcre STATIC IMPORTED)
    set_target_properties(qtpcre PROPERTIES
        IMPORTED_LOCATION_DEBUG ${QT5_DIR}/lib/qtpcre2d.lib
        IMPORTED_LOCATION_RELEASE ${QT5_DIR}/lib/qtpcre2.lib
    )
endif()

set(CommonTestLib
    Qt5::Core
    My_project
    gtest_main
)

if (WIN32)
    list(APPEND CommonTestLib
        Ws2_32.lib
        version.lib
        Netapi32.lib
        Userenv.lib
        Crypt32.lib
        Winmm.lib
        qtpcre
    )
endif()

add_executable (My_project_test test_main.cpp test_cases.cpp)

target_precompile_headers(My_project_test REUSE_FROM My_project)
target_link_libraries(My_project_test ${CommonTestLib})
gtest_add_tests(TARGET My_project_test EXTRA_ARGS --arg1 "${CMAKE_CURRENT_SOURCE_DIR}/data")

最后一行很重要。除了 gtest_add_tests,您还可以使用 add_test。它需要不同的参数,但当您的目标是在 VS2019 的测试资源管理器中显示测试用例时,它也适用。

上述解决方案有帮助的原因:

当您将 enable_testing() 添加到您的顶级 CMakeLists.txt 文件时,它会在您的文件中生成一个顶级 CTestTestfile.cmake 文件构建目录。测试资源管理器需要它来汇总构建过程中生成的所有测试用例。如果您的代码结构中有特定的 CMake 层次结构,您应该有一个类似的 CTest。

我的顶级CTestTestfile.cmake文件内容:

# CMake generated Testfile for 
# Source directory: C:/Projects/myproject
# Build directory: C:/Projects/myproject/out/build/x86-Debug
# 
# This file includes the relevant testing commands required for 
# testing this directory and lists subdirectories to be tested as well.
subdirs("test")

下层CTestTestfile.cmake文件内容:

# CMake generated Testfile for 
# Source directory: C:/Projects/MyProject/test
# Build directory: C:/Projects/MyProject/out/build/x86-Debug/test
# 
# This file includes the relevant testing commands required for 
# testing this directory and lists subdirectories to be tested as well.
add_test(Environment.TestCommandLineArgument "C:/Projects/MyProject/out/build/x86-Debug/test/MyProject_test.exe" "--gtest_filter=Environment.TestCommandLineArgument" "--arg1" "C:/Projects/MyProject/test/data/")
set_tests_properties(Environment.TestCommandLineArgument PROPERTIES  _BACKTRACE_TRIPLES "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.19/Modules/GoogleTest.cmake;380;add_test;C:/Projects/MyProject/test/CMakeLists.txt;38;gtest_add_tests;C:/Projects/MyProject/test/CMakeLists.txt;0;")
add_test(MyProjectExampleCreatorDevice.TestCreateExampleImage "C:/Projects/MyProject/out/build/x86-Debug/test/MyProject_test.exe" "--gtest_filter=MyProjectExampleCreatorDevice.TestCreateExampleImage" "--arg1" "C:/Projects/MyProject/test/data/")
set_tests_properties(MyProjectExampleCreatorDevice.TestCreateExampleImage PROPERTIES  _BACKTRACE_TRIPLES "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.19/Modules/GoogleTest.cmake;380;add_test;C:/Projects/MyProject/test/CMakeLists.txt;38;gtest_add_tests;C:/Projects/MyProject/test/CMakeLists.txt;0;")
...

对我来说,使用 nuget 从 1.8.1.3 升级到 1.8.1.4 破坏了我的项目。 它切换了 Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.3 到 Microsoft.googletest.v140.windesktop.msvcstl.dyn.rt-dyn.1.8.1.3\build\native\Microsoft.googletest.v140.windesktop.msvcstl.dyn.rt-dyn.targets"

恢复到之前为我工作的状态。 (测试资源管理器现在回来了)我认为只要确保你使用静态版本而不是动态版本也应该有效。