支持概要

有关受支持的 Green Hills 编译器的详细信息,请查阅 编译器

BDF 创建/导入提供了 Green Hills INTEGRITY 项目集成 - 请查阅 导入 INTEGRITY 项目以进行单元测试或应用程序监视

  • 将捕获所有原始项目选项
  • 直接导入 .gpj 项目仅支持用于 Green Hills MULTI 项目 (non-INTEGRITY)

C++test 可以测试动态下载加载到 INTEGRITY 内核(由用户指定)上的 INTEGRITY 应用程序项目。 选择要测试的虚拟地址空间(VAS)可以通过单元测试或应用程序监控运行。C++test 支持独立地对 VAS 项目进行自动化测试,因此,如果原始项目具有许多虚拟地址空间并且这些虚拟地址空间彼此交互,则可能需要对集成(.int)文件进行一些手动修改。

C++test 通过支持以下 C/C++ 编译器来启用 INTEGRITY 应用程序 Green Hills MULTI 项目的测试。

  • ccintppc
  • cxintppc

提供以下组件以方便测试 Green Hills MULTI 项目

  • 运行 GHS INTEGRITY 测试 测试配置来启动单元测试
  • 使用 Mem Monitoring 运行 GHS INTEGRITY 应用程序 测试配置来启动应用程序监控

Green Hills INTEGRITY 测试配置中提供以下属性:

  • 调试服务器名称:用来运行测试的模拟器;默认设置为 isimppc
  • 调试主机名称:主机的名称,默认设置为 localhost
  • 调试连接端口:- 端口:默认设置为 2220
  • INTEGRITY 内核:所需的 INTEGRITY 内核的绝对路径;默认设置为 C:\ghs\int1104\bin\sim800\kernel 
  • MULTI 板设置脚本(.mbs): 主板专用设置脚本;没有默认值

已知局限性

  • 不支持 AltiVec 扩展。
  • 不支持 SPE 扩展。
  • 内置测试配置假定您正在通过 rtserv2 连接在 isimppc 模拟器上进行测试。其他方法可能需要自定义测试配置。
  • C++test 不支持通过 INTEGRITY API 执行的多任务处理,因此建议取消对此类 API 功能的调用。
  • 支持使用 Posix API 进行多任务处理。有关更多详细信息,请查阅 测试多线程应用程序
  • 所有单元测试(无论所测试函数属于哪个任务)都将在单个任务中运行。其他任务应禁用,否则可能会干扰测试和覆盖结果。
  • 不支持以下不标准的关键字:
    • __interrupt
    • __packed
    • __bytereversed
    • __bigendian
    • __littleendian
    • __typeof__
    • __linkonce

需求

  • 如果 C++test 项目构建选项中没有指定完整路径,则编译器必须位于 PATH 上。
  • 模拟器(isimppc)必须位于 PATH 上,或在测试配置【调试服务器名称】属性中指定模拟器的完整路径。
  • 调试器(multi)必须位于 PATH 上。

导入 INTEGRITY 项目以进行单元测试或应用程序监视

  1. 准备要测试的项目:
    1. 创建(或使用现有的)动态下载模块。虚拟地址空间(VAS)的数量决定是否需要稍后手动调整(.int)集成配置脚本。
    2. 选择一个 VAS 进行测试(对于 C++test,单个 VAS 是一个原子应用程序)。
    3. 右键单击顶级.gpj 项目,选择 编辑
    4. :binDir=bin 作为其中一个标记添加到项目中。此参数将确保您原始的项目工件不会干扰 C++test 的自动化。C++test 以您的项目目录作为工作目录运行命令,因此,在构建测试可执行文件时,留在那里的构建工件可能会导致不希望的结果。
    5. 在 MULTI IDE 中,双击 .int 文件以显示集成 GUI。
    6. 双击 任务初始化 以显示【任务选项】编辑器。
    7. 选择 自动开始 选项,以允许 C++test 在内核上自动加载并启动经过测试的模块。
    8. 调整活动、测试任务的堆栈大小。C++test 运行时将为经过测试的 VAS 增加大约 8 Kb的开销,因此建议您将堆栈大小增加 0x2000。
    9. 如果您的项目具有不止一个 VAS,请创建原始集成配置脚本(.int),并从中删除所有其他 VAS 描述。
  2. 通过执行以下命令之一来生成构建数据文件(BDF):
    1. 对于 gpj 项目:

      cpptesttrace --cpptesttraceProjectName=<VAS_name>
      --cpptesttraceOutputFile="<dir>\vas.bdf"
      gbuild -all -top <top_prj_name>.gpj <VAS_name>.gpj
    2. 对于 Make 项目:

      cpptesttrace --cpptesttraceProjectName=<VAS_name>
      --cpptesttraceOutputFile="<dir>\vas.bdf" make <target_for_chosen_VAS>
  3. 将项目导入 C++test:
    1. 在 C++test 中,选择 文件> 新建> 项目
    2. 选择 C++test> 创建构建数据文件项目 ,然后单击 下一步
    3. 在步骤2 中提供生成的构建数据文件的路径。
    4. 验证是否正确设置了编译器设置,然后单击 下一步
    5. 查看项目结构,然后单击 完成
  4. 在 VAS 链接期间强制集成以准备要测试的项目:
    1. 右键单击项目节点,并选择 属性
    2. 选择 Parasoft> C++test> 构建设置
    3. -lhostio and -intfile=<path_to_integrate_file> 追加到【选项】章节中的【链接器选项】字段中。C++test 需要与 hostio 库链接,以便使用 fopen() 将单元测试和覆盖率数据写入日志。 intfile 文件是用于您的 INTEGRITY 应用程序的单 VAS .int 文件;它强制集成步骤在链接步骤完成之后进行。
  5. 选择要测试的源,然后选择 Parasoft> 测试使用> 内置> 单元测试> 生成单元测试
  6. 确保所测试函数 调用 Exit() 函数;如果函数被调用,请确保已将其存根。直接调用此函数将导致测试可执行文件过早执行。有关详情,请查阅 Additional Notes
  7. 如果未自动添加地,请将以下语句插入到自动生成的存根中
    #include "INTEGRITY.h.当使用自动生成的存根时, INTEGRITY.h 头文件通常是必需的。
  8. Parasoft> 测试使用> 内置> 嵌入式系统> Green Hills 软件> 运行 GHS INTEGRITY 测试。

补充说明

禁用 grun

默认情况下,在测试配置属性中指定的内核是使用 grun启动的,这是用于运行调试服务器的命令。执行 grun 命令时,默认超时为 180 秒。对于测试执行导致错误行为的情况,这将以可预测的方式停止内核。如果您发现执行测试所需的时间超过 180 秒,那么您可以通过修改 dbserv_timeout (<SetProperty key="dbserv_timeout" value="180" />) 属性的值属性或禁用 grun来修改测试执行流。

若要禁用 grun ,请取消位于测试执行流编辑器中的下面一行的注释,以直接使用调试服务器运行指定的内核:

  • <!--SetProperty key="kernel_cmd" value="${cpptestproperty:dbserv} &quot;${cpptestproperty:kernel}&quot;" /→

在测试执行流编辑器中的下一行进行注释,以禁用 grun 进行内核执行。

  • <SetProperty key="kernel_cmd" value="grun
    ${cpptestproperty:dbserv_timeout_opt} ${cpptestproperty:script_opt}
    ${cpptestproperty:dbserv} -- &quot;${cpptestproperty:kernel}&quot;" />

无论选择哪种运行内核的方法,测试执行流仍将尝试终止测试执行完成后可能正在运行的任何内核进程。

文件同步

为了让测试执行流直到测试执行已经完成运行,采用了文件同步步骤,该步骤可以在测试执行流程的底部找到:

<FileSynchronizeStep
   fileSync="${cpptest:testware_loc}/cpptest_results.tlog" 
   fileInactiveTimeout="10000"
/>

此步骤跟踪测试日志文件的时间戳。在执行测试时,将使用有关每个测试的信息来更新测试日志文件。如果 C++test 检测到日志文件在 10000 毫秒内处于非活动状态,则停止执行。如果您希望单元测试中的闲置时间可能超过10秒,则应将 fileInactiveTimeout 属性的值增加到所需的超时值。有关 FileSynchronizeStep 流步骤的更多信息以及测试流执行的其他信息,请查阅 测试流说明和示例

增加超时时间

当使用 带有 Mem 监视 测试配置的 运行 GHS INTEGRITY 应用程序运行应用程序监视时,文件同步方法可能不足以满足适当的测试执行流。如果您的应用程序包含很少可报告的内存冲突,则结果文件可能不经常更新,这可能会导致不必要的超时。

 除了增加超时时间,您可以使用 FileSynchronizeStep 的其他功能来强制 C++test 等待同步文件的生成以指示应用程序执行结束:

<FileSynchronizeStep
   fileSync="<path/to/synchronization/file.txt>"
   timeout="30000"
/>

该同步文件可以手动从应用程序代码内部生成,也可以提供 CppTest_Finalize 函数的实现类手动编写 FileSynchronizeStep 将等待的文件。这个 CppTest_Finalize 函数自动被称为应用程序执行的最后步骤之一。

创建同步文件之后,您可以将超时增加到足以在应用程序的运行时间内保持不变的值。有关自定义初始化和终止化的更多信息,请查阅 初始化和终止化

防止过早的文本执行完成

如果在测试功能中使用了此类调用,则 Exit() 的调用可能需要将其存根以防止测试执行的过早完成。如果需要,您仍然可以通过实现 CppTest_Finalize 函数来调用 Exit() ,该函数将作为应用程序执行的最后步骤之一被自动调用。有关自定义初始化和终止化的更多信息,请查阅 初始化和终止化

自动重新执行测试

许多 C++test 测试配置使用一种机制,该机制可在单个测试用例中发生意外行为导致测试可执行文件崩溃或中止后,自动重新运行测试可执行文件。此机制将从下一个未运行的单元测试开始重新运行测试可执行文件。但是,由于 Green Hills 框架中针对 INTEGRITY 应用程序的限制,因此在测试 INTEGRITY 应用程序时该机制不可用。如果单元测试导致测试执行的过早终止,则单元测试将结束,并且可以收集到那时的结果。

测试多个虚拟地址空间

尽管 C++test 在单独测试单个 VAS 时效果最好,但在某些情况下,被测试的 VAS 要求与同一 INTEGRITY 应用程序中的另一个 VAS 进行交互。在这种情况下,将需要对工作流程进行一些手动自定义。考虑以下内容:

  • 在与 C++test 集成之前,必须构建其他 VAS。查看 导入单元测试或应用程序监控的 INTEGRITY 项目中的步骤1.
  • 因为 C++test 从项目的位置运行 integrate 命令,所以其他虚拟地址空间的构建构件需要位于项目目录中。另一种选择是将这些生成项目放在 C++test 测试可执行文件位置本身。
  • 对需要与其他虚拟地址空间交互的函数运行自动生成的测试可能会导致不可预知的行为和结果。在尝试测试单个虚拟地址空间与其他虚拟地址空间的结合时,应该小心。

当使用共享库时,C++test 运行时终结

在测试执行和应用程序监视期间,C++test 运行时依赖于调用静态对象的析构函数来完成一些必要的结束步骤。由于 Green Hills MULTI v6.1.x C/C++ compiler v2013.1.x for INTEGRITY on PowerPC 中当前的限制,如果在您的项目中没有使用 -non_shared  标记,则静态对象的析构函数将不会被调用。如果未使用 -non_shared 编译器标签,则您将需要在应用程序 main 函数尾部手动插入对 CppTest_FinalizeRuntime() 函数的调用。这一点将允许 C++test 执行所有必需的终止化步骤。有关如何使用 CppTest_FinalizeRuntime() 函数的其他信息,请查阅 初始化和终止化

  • No labels