CMake项目该如何进行测试

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)

相关阅读