支持概要

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

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

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

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

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

  • ccintppc
  • cxintppc

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

  • Run GHS INTEGRITY Tests 测试配置用于启动单元测试
  • Run GHS INTEGRITY Application with Mem Monitoring 测试配置用于应用程序监控

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

  • Debug Server Name用于运行测试的模拟器;默认设置为 isimppc
  • Debug Host Name主机名称;默认设置为 localhost
  • Debug Connection Port- 端口号;默认设置为 2220
  • INTEGRITY Kernel所需的 INTEGRITY 内核的绝对路径;默认设置为 C:\ghs\int1104\bin\sim800\kernel 
  • MULTI board setup script (.mbs):板卡专用设置脚本;没有默认值

已知局限性

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

要求

  • 如果 C++test 项目构建选项中没有指定完整路径,则编译器必须在 PATH 中。
  • 模拟器(isimppc)必须在 PATH 中,或在测试配置“Debug Server Name”属性中指定模拟器的完整路径。
  • 调试器(multi)必须在 PATH 中。

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

  1. 准备要测试的项目:
    1. 创建(或使用现有的)Dynamic Download 模块。虚拟地址空间(VAS)的数量决定是否需要稍后手动调整(.int)集成配置脚本。
    2. 选择一个 VAS 进行测试(对于 C++test,单个 VAS 是一个原子应用程序)。
    3. 右键点击顶级 .gpj 项目,选择 Edit
    4. :binDir=bin 作为其中一个标记添加到项目中。此参数将确保您原始的项目工件不会干扰 C++test 的自动化。C++test 以您的项目目录作为工作目录运行命令,因此留下的构建工件可能会在构建测试可执行文件时导致不必要的结果。
    5. 在 MULTI IDE 中,双击 .int 文件以显示 Integrate GUI。
    6. 双击 Task Initial 以显示 Task Options 编辑器。
    7. 选择 Start Automatically 选项,以允许 C++test 在内核上自动加载并启动被测模块。
    8. 调整活动/被测任务的“Stack Size”。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-intfile=<path_to_integrate_file> 添加到选项部分的链接器选项字段中。C++test 需要与 hostio 库链接,以便使用 fopen() 将单元测试和覆盖率数据写入日志。intfile 文件是用于您的 INTEGRITY 应用程序的单个 VAS .int 文件;它强制在链接步骤完成后执行集成步骤。
  5. 选择要测试的源文件,然后选择 Parasoft> 测试执行> 内建> Unit Testing> Generate Unit Tests
  6. 确保所测试函数不会调用 Exit() 函数;如果调用了此函数,则应确保已将其打桩。直接调用此函数将导致测试可执行文件提前结束执行。更多详细信息,请参阅其他注意事项
  7. 如果未自动添加,需将以下语句插入到自动生成的桩函数中
    #include "INTEGRITY.h。使用自动生成的桩函数时,INTEGRITY.h 头文件通常是必需的。
  8. Parasoft> 测试执行> 内建> Embedded Systems> Green Hills Software> Run GHS INTEGRITY Tests

其他注意事项

禁用 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 流程步骤的更多信息以及测试流程执行的其他信息,请参阅测试流程说明和示例

增加超时时间

在使用 Run GHS INTEGRITY Application with Mem Monitoring 测试配置运行应用监控时,文件同步方法可能不足以确保正确的测试执行流程。如果应用程序中可报告的内存违规较少,结果文件的更新频率可能过低,从而导致意外超时。

 除了增加超时时间,您还可以使用 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