说明 #
C++test支持劳特巴赫的Trace32调试器执行单元测试,通常情况下Lauterbach是一个通用的嵌入式调试工具,支持Simulator和Emulator两种模式,也就是说可以在仿真器上执行和直接在目标板上执行。这里我们以在Simulator上执行为例在说明如何配置C++test。
因为其为通用调试工具,所以可以调试通过多种编译器生成的可执行文件,例如通过Wind River Diab Compiler 5.9.3来构建的程序。
前提 #
首先程序能够本身编译链接生成可执行文件(.elf)文件。然后可以本身在Trace32中单步执行调试。
环境配置 #
在启动C++test之前首先运行编译器的环境设置batch脚本,C:\WindRiver\env.bat
call env.bat
cpptest
BDF创建 #
启动以后,导入被测项目,本例的项目是非IDE构建的,所以首先得创建用于导入的bdf文件。然后再通过bdf文件导入项目。
生成测试用例 #
单元测试用例生成使用默认的测试配置Generate Unit Tests即可。
定制测试配置 #
在执行单元测试的时候则需要根据调试器的情况做如下配置。首先明确使用的Trace32的调试器是Trace32 Simulator for PPC(PowerPC)
右键此快捷方式,选择属性打开属性对话框。
在此属性对话框中有两个参数,一个是启动的trace32的程序名,另外一个是配置文件名。
C:\T32\bin\windows\t32mppc.exe -c C:\T32\configsim.t32
通过这两个参数设置C++test执行单元测试的测试配置。这里选择内建的针对劳特巴赫trace32的测试配置。
右键选择该测试配置然后复制一份到用户自定义中进行修改,
这里需要修改的在上图红框内标记出来了。
Core(System.CPU value) 设置程序运行的芯片内核型号。
Test executable exit point 设置程序执行结束的退出函数名。这里默认不修改即可,如果在执行单元测试的过程中出错说没有这个函数名称,可以在项目中添加一个如下的简单函数
Path to TRACE32 executable
=> trace32可执行文件的路径,即刚才对应的两个选项的第一个。
T32 config file(default empty)
=> 针对不同系列的配置文件,即刚才对应选项的第二个。
修改后的测试配置如下。
执行单元测试 #
以上操作即完成了所有的配置,直接可以对测试用例进行执行。
通过在“Run Tests using TRACE32 (FDX)”测试配置中的设置,自动调用TRACE32调试器执行这个测试用例。
更多配置 #
对于某些项目是原本执行在Emulator上的,即执行在真实板子上的程序,如果想在模拟器simulator上执行单元测试,本身可能需要修改源代码,也有可能暂时不需要也可以执行,前提条件是本身程序可以在模拟器上执行,从劳特巴赫厂商出了解到,这里我们需要做一些额外的调整和配置,程序就可以执行在模拟器上。在执行之前设置禁用 VLE指令模式。
SYStem.Option.DisMode VLE
通过这个指令可以看到程序本身可以执行到模拟器上,这样我们需要在C++test中也添加此控制命令。修改C++test针对trace 32的控制脚本模板。位于:
C:\Program Files\Parasoft\C++test\9.6\engine\etc\templates\for_recipes\t32_fdx.tja
在系统Up之前添加这条命令,模板改之前为
;===========================================
; initialize and start the debugger
screen.always
RESET
SYStEM.CPU $CORE$
SYStEM.Up
改之后为:
;===========================================
; initialize and start the debugger
screen.always
RESET
SYStEM.CPU $CORE$
SYStem.Option.DisMode VLE
SYStEM.Up
改完后执行C++test可以看到C++test是能够执行,但是某些时候可能执行不能停止,当我们手动的停止后,能够得到测试结果和覆盖率,仔细检查控制模板,发现在执行的时候调试器会等待程序结束。对于某些不能结束的程序,我们需要手动强制其在具体时间内结束。所以需要在改一下控制脚本,改之前为:
;===========================================
; Run tests
GO
$if DEBUG != "true":\$
WAIT !run()
改之后为:
;===========================================
; Run tests
GO
$if DEBUG != "true":\$
WAIT !STATE.RUN() 5.S
IF STATE.RUN()
(
Break.direct
)
这样调整后程序就能自动执行得到覆盖率和结果。