如何通过CMake在Xcode项目中添加iOS Unit Test目标?当前是否支持?
好消息!从CMake 3.14版本开始,已经原生支持创建Xcode的iOS单元测试目标了——再也不用依赖你那篇5年前文章里的各种hack方法,完美解决你的顾虑。下面给你一个完整的可运行示例,一步步带你搭建:
核心结论
CMake 3.14及以上版本完全支持创建Xcode iOS单元测试目标,官方已将该功能纳入正式支持范畴,不需要再使用早年的临时方案。
项目结构参考
假设你的项目目录结构如下:
MyiOSProject/ ├── src/ │ ├── main.m │ ├── ViewController.h │ └── ViewController.m ├── tests/ │ ├── MyTests.h │ └── MyTests.m └── CMakeLists.txt
完整CMakeLists.txt示例
cmake_minimum_required(VERSION 3.14) project(MyiOSProject LANGUAGES OBJC) # 设置iOS部署目标(根据你的需求调整版本) set(CMAKE_OSX_DEPLOYMENT_TARGET 14.0 CACHE STRING "iOS deployment target" FORCE) set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 14.0) # 1. 创建主iOS应用目标 add_executable(MyiOSApp src/main.m src/ViewController.h src/ViewController.m ) set_target_properties(MyiOSApp PROPERTIES MACOSX_BUNDLE YES # 指定支持的设备:1=iPhone, 2=iPad,可按需修改 XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # 替换成你的Apple开发团队ID XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "YOUR_TEAM_ID" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.yourcompany.MyiOSApp" ) # 链接iOS必需的UIKit框架 target_link_libraries(MyiOSApp PRIVATE "-framework UIKit") # 2. 创建单元测试目标 add_executable(MyiOSAppTests tests/MyTests.h tests/MyTests.m ) set_target_properties(MyiOSAppTests PROPERTIES MACOSX_BUNDLE YES # 指定要测试的主应用目标名称 XCODE_ATTRIBUTE_TEST_TARGET_NAME "MyiOSApp" XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "YOUR_TEAM_ID" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.yourcompany.MyiOSAppTests" # 关联主应用的可执行文件,Xcode测试必需属性 XCODE_ATTRIBUTE_BUNDLE_LOADER "$<TARGET_FILE:MyiOSApp>" XCODE_ATTRIBUTE_TEST_HOST "$<TARGET_FILE:MyiOSApp>" ) # 链接主应用、UIKit和XCTest测试框架 target_link_libraries(MyiOSAppTests PRIVATE MyiOSApp "-framework UIKit" "-framework XCTest" ) # 可选:让CMake的ctest工具可以识别并运行测试 add_test( NAME MyiOSAppTests COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target MyiOSAppTests ARGS -Xcodebuild ARGS -test -scheme MyiOSAppTests )
关键注意事项
- 版本要求:必须使用CMake 3.14或更高版本,这个版本是官方完善iOS测试目标支持的起点
- Bundle设置:测试目标必须设置
MACOSX_BUNDLE YES,因为iOS单元测试本质是一个bundle类型的目标 - 关联主应用:
XCODE_ATTRIBUTE_TEST_TARGET_NAME、BUNDLE_LOADER和TEST_HOST这三个属性是核心,用来让Xcode明确测试目标对应的主应用 - 开发团队ID:替换示例中的
YOUR_TEAM_ID为你自己的Apple开发者团队ID,否则Xcode会因签名问题报错 - Swift支持:如果项目使用Swift,只需把源文件换成
.swift,并在project命令中添加Swift语言(project(MyiOSProject LANGUAGES OBJC Swift)),其他属性设置逻辑一致
生成Xcode项目的命令
在项目根目录执行以下命令:
mkdir build && cd build cmake .. -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos
打开生成的MyiOSProject.xcodeproj,就能看到主应用和测试两个目标,直接在Xcode中选择测试scheme即可运行单元测试。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

