本主题概述了 C++test 的跨平台测试过程和要求。各节内容包括:

关于 C++test 的跨平台测试

跨平台单元测试允许在主机中生成和扩展 C++test 单元测试用例 (C++test 安装的开发环境),然后执行一个或多个目标 (软件执行的环境,可能是一个目标嵌入式设备、一个仿真器或者仿真程序,或者是已经连接到软件上的另外一个平台)。这对于测试交叉编译到嵌入式设备或者其它平台上的代码非常 有帮助。

执行目标平台的单元测试的一般过程如下所示:

  1. 打开 ( 或导入 ) 您希望使用 C++test 来测试的项目。
  2. 引入任何额外的编译器 / 链接器符号到 C++test 构建选项 ( 根据您特定环境的需要 )。
  3. 构建测试可执行程序。
    1. 使用内建或自定义测试生成的测试配置来生成测试用例 (例如 生成单元测试)。
    2. 创建自定义测试配置以构建测试可执行程序。例如,您可以禁止使用桩函数并自定义测试执行流程以指定要将结果日志文件写入的位置。
    3. 运行上述测试配置以构建测试可执行程序。
  4. 将测试可执行程序移动到目标设备。
  5. 在目标设备上运行测试可执行程序。
  6. 确保主机可以访问运行结果,然后运行 “系统例程> 收集结果”其中之一的测试配置以便从 C++test 图形用户界面中对结果测试进行分析。

这些步骤在这部分的主题中会有进一步的详细说明。 

支持的环境

  • 主机开发环境:
    • OS: Windows 或 Linux
    • 编译器:GNU GCC 2.95.x – 3.4.x (Windows), GNU GCC 2.95.x – 4.1.x (Linux), Green Hills MULTI v4.0.x Native (Windows), Green Hills MULTI v5.1.x Embedded V800 (Windows), Microsoft Visual Studio (Windows), Sun CC 编译器
  • 嵌入式环境(非排他性):
    • ARM  DS-5 5.18 及更高版本
    • 嵌入式 Linux
    • Green Hills MULTI
    • IAR Embedded Workbench for ARM (从 5.3x 开始)
    • Renesas High-performance Embedded Workshop 4
    • Texas Instruments Code Composer 5.x, 6.0, 7.4, 8.0
    • Wind River Workbench 3.3

参见 支持的环境了解关于编译器支持的详细信息。

了解总体策略

C++test 通过自动生成可在主机、模拟器和实际目标环境上执行的可扩展测试用例,来消除有效的、全面的嵌入式测试的障碍,以验证代码的健壮性,验证功能结果,并获得代码覆盖率指标。它也可以监测运行的应用程序来检测内存问题和跟踪代码覆盖率。

在主机环境中,开发者可以自动生成指定单元和 API 的测试用例核心集,来确认未预期函数对边界条件的响应。使用不同的配置,生成的测试将在方法/功能级上捕获当前的软件行为。然后该测试套件就可根据功能测试的需要进行扩展,自动对回归测试进行配置,如果需要的话还可在主机上执行 (由可配置的桩函数自动的替代目标依赖关系)。 

相同的测试套件随后可以在目标环境下交叉编译执行。为了评价/分析,目标测试结果被保存到一个可 以被载入到 C++test GUI 的文件中。通过 TCP/IP 套接字,测试结果可以自动的发送到 C++test GUI 中。包括分支覆盖率,简单条件覆盖率和 MC/DC 覆盖率在内的覆盖率指标,被所有的测试收集起来。C++test GUI 为调试测试用例提供了广泛的便利性,包括对很多主机调试器的支持、堆栈轨迹报告、调用序列报告和测试用例结果的详细显示等等。

您的原始应用程序也可以用于检测与内存相关的问题,可以交叉编译并在目标计算机上启动,以定位现有的内存错误并收集代码覆盖率。可以将此覆盖率数据与来自单元测试的覆盖率数据结合。

构建一个测试可执行程序

测试可执行程序由检测到的源代码和 C++test 运行时库构建的测试工具组成。 

对于基于主机的测试,C++test 使用 C++test 运行时库的预构建版本,该版本随 C++test 发行版一起提供。 

对于基于目标的测试,需要交叉编译的 C++test 运行时库。C++test 会自动准备一个运行时库的构建。在某些情况当需要非标准的自定义时,您需要手动地准备一个运行时库的构建 (如所述使用 C/C++test 运行时库) 并使用一个交叉编译器来构建测试执行器源码。之后将交叉编译的测试执行器和运行时库与包含标准 OS 功能的库链接在一起(在 C++test 运行时库使用的符号中提供了 C++test 运行时中使用的外部函数的列表)。 

交叉编译测试执行器并将其与 C++test 运行时库链接的过程通常由 C++test(请参见使用 C/C++test 运行时库)自动完成,并且需要在 C++test(请参见使用交叉编译器配置测试)中正确定义交叉编译器。此过程不需要用户交互。 

下图表示建立一个测试可执行程序的过程 :

运行测试可执行程序并收集结果

在把测试可执行程序部署到目标环境中后,您可以启动它并收集测试结果。要开启测试可执行程序,您要调用 “主”函数或者让您的系统来调用它。您的环境将为自动化部署和运行测试可执行程序的过程提供方便。在这种情况下,这些过程可以成为由 C++test 管理的一个测试流程定义的一部分。

如果 C++test 通过套接字通信信道或 RS232 通信信道建立运行时库,测试结果将被发送到由 C++test 发布的监听代理程序中。

如果通过文件通信的支持来构建 C++test 运行时库的,则将测试结果发送到结果文件。

通过文件通信信道收集结果 

开启测试可执行程序之后,预置程序将为测试结果和覆盖率结果创建两个文件。当覆盖率失效时,仅需要创建一个测试结果文件。这些文件将创建在目标环境的本地文件系统中。在一些环境中,文件可以存储在硬盘中;其他的文件将在闪存等基础上执行文件输入/输出。C++test 运行时库使用 ANSI 规定的 标准输入/输出函数来对文件通信信道进行管理。在测试执行过程中,申明会按照如下的图标放入文 件:

在测试完成后,测试日志被传送回主机,因此您可以在 C++test GUI 中查看测试结果。此传送由 C++test 自动完成(如 自定义测试执行流所述) 或者手动传送。 

通过套接字通信收集结果

如果构建的测试可执行文件支持套接字通信信道,则在测试开始时会打开两个 TCP/IP 套接字。一个套接字用于发送测试结果;另一个用于发送覆盖率结果。如果未启用覆盖率,则只会打开一个套接字。

为了通过套接字通信收集结果,您需要一个监听代理,该代理可以监听给定的端口并将数据写入主机上的文件。C++test 提供了监听代理的基本实现。但是,您可以使用任何能够监听端口并将数据转储到文件的实用程序。

测试执行完成后,监听代理将刷新结果文件。然后,您可以在 C++test GUI 中读取结果,就像基于文件的通信一样。

下图说明了基于套接字的通信过程:

通过串口通信收集结果

当测试可执行程序构建来支持串口通信方式时,依据测试可执行程序的启动,串口连接将被初始化,并且测试数据将会从目标设备上发送到在主机上启动的监听代理。监听代理将从覆盖率数据中分离测试数据并保存它们到单独的文件。然后,您可以在 C++test GUI 中读取结果,就像基于文件的通信一样。  串口通信过程如下图所述:

在目标设备上自动执行单元测试的测试执行流程

通过定义自定义执行流程,您可以在无法使用默认 C++test 流程的开发环境启用测试自动化,例如嵌入式/跨平台开发,其中的测试涉及准备测试工具,构建交叉编译工具。在目标设备上部署并启动它,将测试结果下载回主机,并提示 C++test 读取结果。可以使用自定义的执行流程来执行能够在操作系统中开启的外部工具(例如,make、ftp 工具、目标通信管理程序等等)。

自定义测试执行流 描述您如何使用自定义的执行流程,在目标设备上自动执行单元测试。如我们描述,所期望的如何实现自动化的工作流程是 : 

  1. 准备测试工具(检测用户源码,生成/收集测试用例)。
  2. 构建测试工具。
  3. 将测试可执行程序部署到目标设备。
  4. 自动执行测试或等待执行测试。
  5. 下载测试和覆盖率结果到主机,由 C++test 读取它们。


  • No labels