关联问题分析
您链接的问题的答案有几个问题:
最小的工作示例
CMakeLists.txt:
cmake_minimum_required(VERSION 3.21)
project(so70759660)
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
tests/CMakeLists.txt:
find_package(MSUnitTestFramework REQUIRED)
find_program(VSTest_EXECUTABLE NAMES vstest.console.exe REQUIRED)
add_library(mytest)
target_sources(mytest PRIVATE Mytest.cpp)
target_link_libraries(mytest PRIVATE MSUnitTestFramework::MSUnitTestFramework)
add_test(NAME mytest COMMAND "${VSTest_EXECUTABLE}" "$<TARGET_FILE:mytest>")
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)
注意事项:
- 使用
IMPORTED 目标并通过target_link_libraries() 链接它是include_directories()/include_libraries() 的现代替代方案。
-
FindMSUnitTestFramework 模块负责定位和创建这个导入的目标。请注意,我提供的示例是相当硬编码的,并且在查找库以及可能考虑不同的 Visual Studio 版本或目标体系结构等方面不是很“聪明”。您可能需要对此进行改进。
tests/MyTest.cpp:
#include <CppUnitTest.h>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
TEST_CLASS(Class1) {
public:
TEST_METHOD(Method1) { Assert::AreEqual(0, 0); }
TEST_METHOD(Method2) { Assert::AreNotEqual(0, 42); }
};
CMakePresets.json:
{
"version": 3,
"configurePresets": [
{
"name": "vs2022",
"generator": "Visual Studio 17 2022",
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "cl",
"CMAKE_CXX_COMPILER": "cl",
"BUILD_TESTING": "ON",
"BUILD_SHARED_LIBS": "ON"
}
}
],
"buildPresets": [
{
"name": "vs2022",
"configurePreset": "vs2022"
}
],
"testPresets": [
{
"name": "vs2022",
"configurePreset": "vs2022",
"configuration": "Debug"
}
]
}
兼容性
我只能通过结合使用 Visual Studio 生成器和 MSVC 工具链来运行它。对于其他生成器(Ninja、Make 等),我总是遇到链接器错误,但无法弄清楚原因是什么。
VS Code 会在测试资源管理器中显示测试(您可能需要 CMake Test Explorer 扩展名),但 Visual Studio 不会。我怀疑这是一个普遍的问题,VS 只能识别 add_test(<name> <command> <args>) 签名,但不能识别带有多配置生成器的 add_test(NAME <name> COMMAND <command> ...)。这是一个相关的bug report。但不幸的是,第一个签名是不够的,因为它不支持像 $<TARGET_FILE:...> 这样的生成器表达式。
个人意见
恕我直言,如果您可以选择使用哪个单元测试框架/库,我建议您再次使用 Microsoft 单元测试框架,原因如下:
- 您将自己限制在 MSVC 工具链中。
- 它是为 Visual Studio/MSBuild 量身定制的。将其集成到任何其他构建系统中是相当乏味的。
- AFAIK 你甚至不能单独安装它,而只能将它作为 Visual Studio 的一部分安装。
- 它不是跨平台的,所以你总是会被 Windows 卡住。
我的建议是使用可以与不同编译器/工具链一起使用的跨平台的东西,可能是开源的,并且可以更好地与其他构建系统集成。示例包括 GTest、Catch、Boost.Test 等。有了这些,您可以使用单一配置生成器,例如Ninja 和 Visual Studio 中的测试资源管理器应该会发现它们。强调文本