Visual Studio集成单元测试的CMake文件

7
Visual Studio 2017集成了C++单元测试(本机,Google Test,CTest等)。我该如何创建一个CMakeLists.txt文件来创建一个项目,以使用集成的IDE测试,例如使用Google Test或本机Microsoft单元测试框架?不幸的是,Microsoft的所有示例都只在Visual Studio中创建项目,而不是从CMake文件开始。任何帮助都将不胜感激,谢谢!
2个回答

14

Mikewho,

我使用Google Test项目创建了一个小例子,可以与集成的IDE测试一起工作。

创建一个空目录并保存这两个文件:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(test_me)

# GTest
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# Unit Tests
# Add test cpp file
add_executable( runUnitTests tests.cpp)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_BOTH_LIBRARIES})
add_test( runUnitTests runUnitTests )

测试代码.cpp

#include <gtest/gtest.h>

TEST(ABC, TEST1) {
  EXPECT_EQ(true, true);
}

在命令提示符中输入

mkdir build
cd build
cmake .. "-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
注意:我已经使用vcpkg安装了gtest。
C:\dev\vcpkg>vcpkg.exe install gtest

请确保在Visual Studio 2017中安装了这个组件:
插入图片描述

在“工具”>“选项”>“Google Test测试适配器”中将正则表达式设置为“.exe”:
插入图片描述

然后编译解决方案,点击“测试资源管理器”中的“运行所有”按钮:
插入图片描述

第一次运行时,测试用例会被发现。

[12/3/2018 8:38:41 AM Informational] ------ Run test started ------
[12/3/2018 8:38:42 AM Warning] Could not locate debug symbols for 'C:\dev\cpptests\GoogleTest\build\Debug\runUnitTests.exe'. To make use of '--list_content' discovery, ensure that debug symbols are available or make use of '<ForceListContent>' via a .runsettings file.
[12/3/2018 8:38:42 AM Informational] Test Adapter for Google Test: Test execution starting...
**[12/3/2018 8:38:42 AM Informational] Found 1 tests in executable** C:\dev\cpptests\GoogleTest\build\Debug\runUnitTests.exe
[12/3/2018 8:38:42 AM Informational] Running 1 tests...
[12/3/2018 8:38:42 AM Informational] Google Test execution completed, overall duration: 00:00:00.2390446
[12/3/2018 8:38:42 AM Informational] ========== Run test finished: 1 run (0:00:01.2668844) ==========

我希望这可以帮助你?


1
非常有帮助,谢谢你。我已将其标记为答案。如果您有时间,了解如何针对Microsoft单元测试框架进行调整将是很棒的事情。 - mikewho
请开一个新问题,涉及MS单元测试框架,我会回答它。 - Damian
我已经发布了,谢谢! https://dev59.com/k7Dla4cB1Zd3GeqP7WOD - mikewho
3
起初我无法理解为什么它对我不起作用。VS和cmake仍然找不到gtest包。 然后我弄清楚了。我必须显式安装x64包。 .\vcpkg install gtest:x64-windows - Alex D
2
另外,如果在安装完软件包后执行“. \ vcpkg.exe integrate install”,它将连接到VS中安装的所有软件包,然后您就不需要使用指定CMAKE_TOOLCHAIN_FILE的cmake来查看软件包。 - Alex D
当我将由vcpkg安装的gtest头文件添加到*.sln项目中时,为什么测试结果不会出现在测试资源管理器中? - Kargath

2
尽管我回复有些晚了,但这是任何参考的最新答案。
对于微软单元测试框架,以下简化文件适用于我:
CMakeLists.txt
set(UNIT_TEST_TARGET_NAME my_lib)
add_library(${UNIT_TEST_TARGET_NAME} SHARED)
target_sources(${UNIT_TEST_TARGET_NAME} PRIVATE 
    tests.cpp
    tests.h
)
target_link_libraries(${UNIT_TEST_TARGET_NAME} 
    PRIVATE MSUnitTestFramework::MSUnitTestFramework)
enable_testing()
find_program(VSTest_EXECUTABLE NAME vstest.console.exe REQUIRED)
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(MSUnitTestFramework REQUIRED)
add_test(NAME ${UNIT_TEST_TARGET_NAME} 
    COMMAND "${VSTest_EXECUTABLE}" "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${UNIT_TEST_TARGET_NAME}.dll"
)

/cmake/FindMSUnitTestFramework.cmake

add_library(MSUnitTestFramework::MSUnitTestFramework SHARED IMPORTED)
set_target_properties(MSUnitTestFramework::MSUnitTestFramework PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "$ENV{VCInstallDir}Auxiliary/VS/UnitTest/include"
  IMPORTED_IMPLIB "$ENV{VCInstallDir}Auxiliary/VS/UnitTest/lib/x86/Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib"
)
set(MSUnitTestFramework_FOUND TRUE)

tests.cpp

#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace my_unit_test
{
    TEST_CLASS(my_tests)
    {
    public:
        TEST_METHOD(test1)
.
.

你可以从MSVC中运行所有测试等操作。
顺便提一下,你不必使用add_test来为整个DLL添加测试,而是可以逐个添加测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接