C/C++test做静态分析、单元测试之前,得先让测试工程正确拿到源文件、编译器和原工程里的编译选项。很多导入失败其实不是代码有问题,而是工程只导进了文件目录,头文件路径、宏定义、编译器参数没有一起带进来;Makefile工程、交叉编译工程尤其容易碰到这类情况。下面以C/C++test Professional的Eclipse/Standalone界面为主,说明测试工程怎么配置,以及工程导不进来、导入后大量文件报错时该从哪里查。
一、C/C++test怎么配置测试工程
1、已有Eclipse工程直接配置测试参数
原工程本身就是Eclipse/CDT工程时,可以保留现有工程结构,再给它补上C/C++test测试配置。
①在【Project Explorer】中找到待测试工程。
②右键工程,选择【Properties】。
③展开【Parasoft】→【C/C++test】。
④打开【Build Settings】。
⑤在【Options source】中选择与原工程匹配的参数来源。Eclipse Managed Make工程可以使用【Use options from the project】;工程由外部Makefile编译时,可改用【Use options from a build system】。
⑥检查【Compiler settings】,确认C编译器、C++编译器和【Compiler family】与原工程一致。
⑦点击【Apply】→【OK】保存配置。
C/C++test会根据Options source决定从哪里读取头文件目录、宏定义和编译参数,这项设置不对,工程虽然能打开,代码分析仍会出现大量解析错误。
2、Makefile工程用Build Data File创建测试工程
原项目没有现成的Eclipse工程,或者构建过程比较复杂,可以先采集一次真实编译过程,再用BDF创建工程。
①打开原项目能够正常编译的命令行环境。
②使用【cpptestscan】或【cpptesttrace】采集构建过程,生成【Build Data File】。
③启动C/C++test,点击【File】→【New】→【Project】。
④选择【C/C++test】→【Create project from a build data file】。
⑤在向导中选择生成好的【.bdf】文件。
⑥检查识别到的【Compiler】配置。
⑦确认工程目录和源文件列表没有缺失后,点击【Finish】。
BDF里保存的是实际构建时采集到的编译命令和文件信息,用这种方式建立工程,对Makefile、交叉编译以及自定义构建脚本通常更合适。
3、把编译参数检查完整
工程建好后,不要马上跑整套测试,先把构建参数过一遍。
①右键工程进入【Properties】→【Parasoft】→【C/C++test】→【Build Settings】。
②检查【Build working directory】是不是原构建命令实际执行的位置。
③使用外部构建系统时,检查【Build command line】能不能在当前环境正常执行。
④核对【Compiler executable】和【Linker】。
⑤查看头文件搜索路径、宏定义和额外编译参数有没有被带进来。
⑥修改完参数后点击【Reset cache】,让C/C++test重新扫描构建选项。C/C++test支持从构建系统、BDF或工程本身读取编译选项,配置变化后可以重新扫描缓存。
二、C/C++test测试工程导入失败如何排查
1、检查工程文件和Workspace
如果使用【File】→【Import】导入已有Eclipse工程,先看工程本身能不能被当前Workspace识别。
①找到源工程目录,确认根目录中存在【.project】。
②检查【.project】文件是否完整,没有被版本管理工具忽略或删除。
③查看当前【Project Explorer】中是否已经存在同名工程。
④同名旧工程不用时,先从Workspace移除,再重新执行【Import】。
⑤导入时确认选择的是正确工程根目录,不要只指向src等源码子目录。
命令行导入也是按【.project】或包含Eclipse工程的目录识别项目;如果目录里没有有效工程定义,就不能按普通Eclipse工程直接导入。
2、BDF能选中但创建工程失败
这种情况重点检查BDF有没有真正采集到编译动作。
①打开生成BDF时使用的构建环境。
②先手工执行原来的【make】【ninja】或项目构建命令,确认源码能够正常重新编译。
③如果工程已经是最新状态,先执行【clean】再重新采集,避免构建系统直接提示“无需编译”。
④重新运行【cpptestscan】或【cpptesttrace】生成新的【.bdf】。
⑤回到【Create project from a build data file】,换成新文件重新创建。
⑥工程源码刚换过分支、编译参数有修改时,不要继续沿用很早以前生成的BDF。
C/C++test依靠实际编译命令收集输入范围,如果构建没有触发编译,采集文件里就可能缺少待测源码对应的数据。
3、检查编译器和环境变量
工程导入后满屏头文件错误,或者构建扫描阶段直接失败,可以先在系统命令行确认工具链。
①打开启动C/C++test时使用的同一套环境。
②输入编译器命令,确认【gcc】【g++】【clang】或项目使用的交叉编译器可以直接找到。
③执行【make--version】或对应构建工具命令。
④检查【PATH】里是否包含编译器、链接器和构建工具目录。
⑤使用交叉工具链时,在【Compiler settings】里确认【Compiler family】没有选成主机GCC。
⑥重新打开工程,进入【Build Settings】执行一次参数扫描。
C/C++test自动识别编译器和Makefile设置时,相关可执行文件通常要能从当前环境找到;工具链没有进入PATH,是工程扫描失败时很常见的一处问题。
三、工程导入成功但无法正常测试怎么处理
1、修复源码路径和Linked Folder
工程能看到源码,却提示文件不存在时,要检查链接目录。
①右键异常目录选择【Properties】。
②查看资源实际指向的位置。
③进入工程【Properties】检查路径变量。
④确认源码移动后,原来的【Linked Folder】没有继续指向旧路径。
⑤工程多人共用时,尽量用【${project_loc}】或【${resource_loc}】这类工程变量,少写固定的本机绝对路径。
⑥修正后执行【Refresh】,再到【Build Settings】点击【Reset cache】。
C/C++test的工程配置支持项目路径和资源路径变量,源码使用链接目录时,路径变量失效会直接影响构建参数和文件定位。
2、先用少量源码验证配置
工程刚导好时,不建议直接把整个项目拿去跑单元测试。
①在【Project Explorer】中选择一个依赖较少的.c或.cpp文件。
②右键选择【Parasoft】测试入口。
③先运行一套基础静态分析配置。
④观察是否还有【header not found】【compiler configuration】或宏解析错误。
⑤基础解析正常后,再扩大到目录或整个工程。
⑥准备做单元测试时,再检查链接参数、测试执行环境和交叉编译目标。
这样可以很快分清问题是在“工程配置”还是后面的“单元测试构建”,排查范围会小很多。
总结
C/C++test测试工程能不能正常使用,很大程度上取决于原项目的构建信息有没有完整带进测试环境。工程导入以后如果出现源码缺失、头文件报错或编译器无法识别,通常可以从工程定义、构建数据、工具链环境和源码路径几个方向找到原因。测试工程配置稳定后,再继续做静态分析和单元测试,后面的错误会少很多。如需进一步了解C/C++test测试工程配置、Build Data File使用与工程导入故障排查,欢迎联系咨询。