
CMake项目经常碰到,在之前,我们都是使用的CMake自带的命令,先生成Makefile文件,然后使用cpptesttrace.exe跟着make命令生成BDF文件。但是这样生成的BDF文件里不仅包含项目中的文件,还包含CMake自动生成的文件,有时还会出现文件重复的问题(一般因为项目编译时,文件被拷贝到build文件夹下)。从2020.1版本开始,C/C++test开始对CMake项目有了针对性的支持,本篇文章简单介绍一下CMake项目该如何进行测试。
使用条件
C/C++test2020.1版本以上。
具体使用
具体使用只有导入项目方式跟其他项目有些区别,导入项目有两种方式:
生成json文件方式
修改CMakeLists.txt文件方式
前者使用简单,仅适用于静态分析,因为生成的json文件中没有包含link信息,而这是所单元测试需要的。后者相对要麻烦,但是支持单元测试。
生成json文件方式
这种方式使用的是CMake自带的功能,主要方式是修改CMAKE_EXPORT_COMPILE_COMMANDS选项。两种方式:
在CMakeLists.txt文件中将CMAKE_EXPORT_COMPILE_COMMANDS选项设置为ON;
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
生成构建脚本时,将其添加到cmake的命令行调用中。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1
修改CMakeLists.txt文件方式
修改主CMakeLists.txt文件,将/integration/cmake/cpptest-project.cmakeinclude进来(大部分情况下,其实不需要修改这个cpptest-project.cmake文件);
根据情况加上cpptest_add_executable(),具体下面说明;
运行CMake的时候设置CPPTEST_PROJECT=ON,实际命令可能是cmake -DCPPTEST_PROJECT=ON ..;
使用import projects的方式,将项目导入到workspace中,命令行就使用-import参数替代-bdf参数,这里导入项目的文件地址一般就是项目文件夹,如果找不到,可以在项目下搜索 .parasoft文件;
后面就是基本的静态分析和单元测试的步骤了。
cpptest_add_executable()的详细说明
其实这个部分,我们不仅仅是要添加cpptest_add_executable(),如果有需要,我们还需要添加target_include_directories()和target_link_libraries(),否则可能缺少链接信息等。
添加的原则是遇到add_executable()添加cpptest_add_executable(),遇到target_include_directories()添加target_include_directories(),遇到target_link_libraries()添加target_link_libraries()。一般情况下,这些都在各个模块的CMakeLists.txt文件中出现。
cpptest_add_executable部分
按照用户手册中提到的,cpptest_add_executable部分组成如下:
cpptest_add_executable(
[CPPTEST_COMPILER_ID ]
[CPPTEST_PROJECT_NAME ]
[CPPTEST_PROJECT_LOC ]
[CPPTEST_PROJECT_FOLDERS <name1=location1> <name2=location2> …]
[EXCLUDE_FROM_ALL]
SOURCES … | TARGETS …
)
这里详细说明一下几个必需要设置的参数:
:这个必需要设置,内容随意,我个人喜欢在原项目名后加_cpptest,但是这个参数会关系到其他地方的设置。另外如果是一个大项目下面包含的多个模块,那么各个模块的需要设置成不同的;
SOURCES:这个与TARGETS是二选一,后面跟需要跟踪编译信息的文件,有的时候,我们能够从CMakeLists.txt文件中找到相关的变量,而不需要将涉及的源文件一一列出来;
TARGETS:我个人更喜欢使用TARGETS,比如CMakeLists.txt文件中有project(xxx),那么我们就可以设置TARGETS xxx;
target_link_libraries/target_link_libraries部分
这部分的设置参照原本的target_link_libraries就行,但是其中的需要跟上面的对应起来。
比如,原本的是
target_link_libraries(main mod1 mod2 mod3)
那么我们就需要再添加
target_link_libraries(main_cpptest mod1 mod2 mod3)