本主题概述了 C++test 的跨平台测试过程和要求。章节目录:

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

跨平台测试允许在主机(安装 C++test 的开发环境)上生成和扩展 C++test 测试,然后在一个或多个目标(软件将执行的环境,可能是目标嵌入式设备、模拟器或仿真器,或您已将软件移植到的其他平台)上执行。这对于测试将在嵌入式设备或其他平台上使用的交叉编译的代码而言尤其有用。

执行基于目标测试的一般程序如下:

  1. 打开(或导入)您想用 C++test 测试的项目。
  2. 在 C++test·构建选项中引入额外的编译器/链接器标志(根据特定环境的需要)。
  3. 构建测试可执行文件。
    1. 通过内建或自定义测试生成的测试配置(例如,Generate Unit Tests)生成测试用例。
    2. 创建一个自定义测试配置来构建测试可执行文件。例如,您可以禁用桩函数的使用并自定义测试执行流程,以指定写入结果日志文件的位置。
    3. 运行上述测试配置来构建测试可执行文件。
  4. 将测试可执行文件移动到目标环境。
  5. 在目标环境运行测试可执行文件。
  6. 确保主机可以访问结果,然后通过运行一个“Utilities> 收集结果”测试配置在 C++test GUI 中进行结果分析。

这些步骤在本节的主题中有详细描述。 

支持的环境

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

了解总体策略

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

在主机环境中,开发人员可以自动生成一组核心单元 和 API 测试用例,旨在识别极端条件下的意外函数响应。通过使用不同配置,生成的测试将在方法/函数级别捕获当前的软件行为。该测试套件之后可以根据功能测试的需要进行扩展,自动配置以进行回归测试,并根据需要在主机上执行(目标依赖关系自动替换为可配置的桩函数)。 

相同的测试套件可以被交叉编译,以在目标环境中执行。目标测试结果将保存到一个文件中,该文件可以加载到 C++test GUI 中进行评估/分析。测试结果可以通过 TCP/IP 套接字自动发送到 C++test GUI。为所有测试收集包括分支、简单条件和 MC/DC 覆盖率在内的覆盖率指标。C++test GUI 提供了广泛的调试测试用例功能,包括对多种主机调试器的支持、堆栈跟踪报告、调用序列报告以及详细的测试用例结果显示。

您的原始应用程序也可以进行代码插桩以检测内存相关问题,进行交叉编译并在目标环境中启动,从而查明现有的内存 bug 并收集代码覆盖率数据。该覆盖率数据可与单元测试中的覆盖率数据相结合。

构建测试可执行文件

测试可执行文件由围绕插桩的源代码和 C++test 运行时库构建的自动化测试框架组成。 

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

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

交叉编译自动化测试框架并将其与 C++test 运行时库联系起来的过程通常由 C++test 自动执行(请参阅使用 C++test 运行时库)并要求在 C++test 中正确定义交叉编译器(请参阅使用交叉编译器配置测试)。此过程不需要用户交互。 

下图展示了构建测试可执行文件的过程:

运行测试可执行文件并收集结果

将测试可执行文件部署到目标环境后,启动可执行文件并收集测试结果。要启动测试可执行文件,您可以调用“main”函数或者通过系统调用。理想情况下,您的环境将提供部署和运行测试可执行文件过程自动化的功能。在该情况下,这类过程可以成为由 C++test 管理的测试流程定义的一部分。

如果 C++test 运行时库构建包含套接字通信通道或 RS232 通信通道,结果将发送给 C++test 发行版提供的监听代理。

如果 C++test 运行时库构建包含文件通信支持,测试结果将发送到结果文件中。

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

测试可执行文件启动后,初始化例程将为测试结果和覆盖率结果创建两个文件。当覆盖率被禁用时,将只创建一个测试结果文件。这些文件在目标环境的本地文件系统中创建。在某些环境中,文件可以存储在硬盘上;其他环境中则可能基于闪存等实现文件 I/O。C++test 运行时库使用 ANSI 标准 I/O 函数来管理文件通信通道。在测试执行期间,断言被记录到文件中,如下图所示:

测试完成后,需要将测试日志传输回主机,以便在 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 读取。