本主题说明如何在旨在使用 Wind River Tornado 编译器编译/构建和/或借助 Wind River Tornado IDE 编写的代码上配置和运行单元测试。
此章节:
关于单元测试
术语“单元测试”涵盖与构建和运行测试对象有关的所有内容。在执行单元测试之前,熟悉以下 C++test 术语/功能会有所帮助:
- 生成: 生成在测试套件中分组的测试用例。
- 仪器仪表: 修改被测源代码允许 C++test 在测试对象运行时期间收集信息。您可以自定义检测功能。
- 覆盖率: 衡量测试覆盖测试中的源代码的程度。
- 桩函数: 替换不需要的/不安全的例程(并生成丢失的例程),以促进测试对象的成功构建和安全运行。
- 运行时数据库: 请参见Understanding and Building the Runtime Library。
- 构建测试对象: 这包括成功构建测试对象所需的一切—源文件和测试套件产生的最终工件,必须执行该工件才能收集运行时数据(例如测试用例结果和覆盖率数据)。
- 执行: 运行测试对象的过程。运行时数据在此阶段收集,并在终止后显示。
由于 VxWorks 测试对象/可重定位对象是通过 -r 选项链接的,因此不会检查符号(函数/变量)定义的存在,因此在链接期间不会报告发生的任何符号解析错误。结果,您将不知道是要忘记定义这些定义,还是会因范围错误而导致无法包含这些定义,直到测试对象崩溃之前的执行阶段。要接收有关此类问题的预先警告,请确保用于单元测试的【测试配置】已启用执行早期检查潜在的链接器问题选项(在执行> 符号 选项卡中),并且已配置为使用生成的外部 VxWorks 映像符号清单(如提供库符号的外部列表 中所述)。
为了正确执行单元测试,必须正确设置所有项目设置 (有关设置的详细信息,请参见 设置目标/平台依赖选项)。
本主题的以下各节介绍如何构建 C++ test 运行时库(如果您要手动执行此操作以进行其他控制/自定义),描述如何从 VxWorks 映像生成外部符号列表,提醒您使用哪些 Tornado 工具 必须先启动并运行,然后才能实际执行测试对象,熟悉专门为 Tornado 测试设计的测试配置,并说明测试流程的自定义如何使您能够根据需要调整测试对象以适合嵌入式测试的情况。
有关单元测试的更多信息,请参见 测试创建和执行。
了解和构建运行时库
要了解运行时库,请参见 使用 C++test 运行时库。
示例:使用 VxWorks 构建 Tornado 的运行时库
要使用 Tornado 工具和 VxWorks OS 构建运行时库(假设您已正确设置了所需的 Tornado 环境变量-请参见前提条件):
- 转到运行时库源根目录(C++test_install_dir/engine/runtime)。
输入命令
make TARGET_CFG:=
然后输入WR_egcs_simnt_VxWorks5_4.mk
或WR_gcc2_9_simnt_VxWorks5_5.mk
(取决于您的 Tornado/VxWorks 版本)。
您还可以在命令行上指定以下变量:
- 此 OUT_DIR 变量。
- 如果使用备用源进行构建,则使用 CPPTEST_INC_DIR 变量。
示例:使用提供的 Tornado 项目/工作空间
要从 C++test 提供的 Tornado 项目或工作空间中构建运行时库,请执行以下操作:
- 跳转到
C++test_install_dir/engine/runtime/projects
。 - 打开适当的项目或工作空间。从
Tornado2_0
orTornado2_2
里选择一个, 取决于您的 Tornado/VxWorks 版本。 - 构建打开的 C++testRtLib 项目。
您可以复制和编辑 C++test_install_dir/engine/runtime/target
中可用的任何 .mk 目标配置,并将其提供给 TARGET_CFG 参数。您还可以向 Tornado 项目中添加其他构建目标,以调整构建选项和/或更改目标。
生成外部 VxWorks 映像符号列表
需要使用外部符号列表才能使用【测试配置】构建 VxWorks 测试对象,该对象已启用执行潜在链接问题的早期检查 选项,例如所有内置的与 Tornado 相关的测试配置。该列表应包含在 VxWorks 内核映像中定义的用于运行应用程序的所有符号。
您可以按以下方式生成此列表:
- 确保正确设置了所需的 Tornado 环境变量 - 请参见前提条件。
- 复制内置的“嵌入式系统>Wind River>从 VxWorks 映像中提取符号”测试配置。
- 打开执行选项卡。
- 调整 符号列表工具名称 测试流程属性以匹配适合于用于创建映像的编译器的符号转储工具的名称,—例如, nmsimpc (用于 ccsimpc)。
- 根据需要调整 符号列表选项
- 设置 路径为 VxWorks 映像以扫描符号【测试流程】属性到您的 VxWorks 图像的路径,例如
"%WIND_BASE%\target\config\simpc\vxWorks"
- 运行调整后的配置
有关外部符号列表的更多信息,请参见提供库符号的外部列表。
执行测试对象
当在用户指南的这一部分中使用术语“测试对象”时,是指从您的源文件和测试套件中产生的最终工件,必须执行该最终工件才能收集运行时数据(例如测试用例结果和覆盖率数据)。但是在《 C++test 用户指南》的其他部分中,使用了“测试可执行文件”术语。我们在讨论嵌入式开发时会有所不同,因为嵌入式系统并不总是支持“可执行文件”,即二进制文件的类型,可以将其称为应用程序映像,并且可以由系统本身加载(解压缩)并执行。例如,在 VxWorks 5.4 和 VxWorks 5.5 的情况下,您可以构建一个在应用程序过程中链接的完整系统映像,也可以构建一个不完整的可重新删除对象,该对象仅包含来自应用程序的符号,并在以后与预构建系统映像链接。
在针对 VxWorks 进行 Tornado 测试的情况下,C++test 将尝试构建第二种类型的对象(最好将其描述为“可重定位的测试”),并使用称为 Tornado Shell(windsh)的原始 Tornado 工具运行它们。在启动运行时测试之前,您需要先安装 Tornado 注册表(wtxregd)和目标服务器(tgtsvr)并将其与运行 VxWorks 的目标连接(请参见前提条件)。
例如,要准备测试环境以在 VxWorks 模拟器上进行测试(假设您正确设置了所需的 Tornado 环境变量-请参见前提条件),则可以使用原始 Tornado 接口或以下示例步骤/命令:
- 将 WIND_UID 环境变量设置为您的 UID。更多关于 WIND_UID 的详细信息,请参见 Tornado 用户指南。
- 启动 Tornado 注册表。
wtxregd & '
启动 VxSim。
"%WIND_BASE%\target\config\simpc\vxWorks" &
启动目标服务器。
tgtsvr vxsim -B wdbpipe -R "C:\Temp" -RW &
VxSim 的默认 Tornado 装运版本已预先配置了对传递文件系统(PassFS)和目标服务器文件系统(TSFS)的支持。此支持以及上述设置使测试对象能够与运行时库的默认版本(请参见Understanding and Building the Runtime Library)并使用其中一个文件系统传输结果。
有关 Tornado 工具和 VxWorks 的更多信息,请参考 Tornado 用户指南。
了解 Tornado 测试配置
有几种专门用于 Tornado 项目的测试配置:
- 构建 VxWorksTest 对象 (PassFS)
- 构建 VxWorksTest 对象 (sockets)
- 构建 VxWorks Test 对象 (TSFS)
- 加载并运行 VxWorks 测试对象
- 加载并运行 VxWorks 测试对象(Socket)
- 运行 VxWorks 单元测试(PassFS)
- 使用 Mem 监测(PassFS)运行 VxWorks 应用程序
所有这些都可以在 嵌入式系统> Wind River> Tornado 类别中找到。
这些【测试配置】均基于以下专门设计的测试流程配方(请参见Customizing Test Configurations through Test Flow Recipes):
- 构建 VxWorks 测试对象 - PassFS 上的 File Channel
(WRTornadoBuildVxWorksPassFS.recipe)
- 构建 VxWorks 测试对象 - Socket Channel
(WRTornadoBuildVxWorksPassFS.recipe)
- 构建 VxWorks 测试对象 - TSFS 上的 File Channel
(WRTornadoBuildVxWorksPassFS.recipe)
- 使用 Wind River Shell 加载并运行 VxWorks 测试对象
(WRTornadoLoadAndRun.recipe)
- 使用 Wind River Shell 加载并运行 VxWorks 测试对象- Socket Comm
(WRTornadoLoadAndRunSocket.recipe) - 在 VxWorks 上运行单元测试- PassFS 上的 File Channel
(WRTornadoVxWorksPassFSFull.recipe) - 在 VxWorks 上运行应用程序-PassFS 上的 File Channel
(WRTornadoVxWorksPassFSApp.recipe)
这是上述测试配置和测试流程配方中使用的术语的简短说明。
- 构建 - 这些测试配置将构建测试对象,其中包括生成和读取静态覆盖率数据(如果启用),但不会启动测试对象或读取任何结果。
- 加载并运行 - 这些测试配置使用 Wind River Shell 启动测试对象 (Executing Test Objects 有关测试对象执行的信息)。一个用于套接字的工具使用一种名为“套接字侦听器”的工具从运行测试的计算机接收结果数据流。
- 运行 -这些测试配置是构建测试对象,启动它并读取结果的多合一配置。当前可用于 VxSim。
- PassFS - 这些使用传递文件系统进行结果处理。该 FS 仅在 VxSim 上可用并且-因为 VxSim 只是普通的主机应用程序-提供了普通主机的文件 I/O。可以使用默认的可以使用默认的“实用程序>加载测试结果(文件)”测试配置来读取使用 PassFS 的测试对象产生的结果。
- TSFS - 它们使用目标服务器文件系统功能,从而利用目标服务器处理目标文件 IO 请求并将其定向到主机的能力。使用 TSFS 的优点是它可以与 VxSim 和 ”real”目标一起使用。必须在用于运行应用程序的 VxWorks 映像中正确启用和初始化 TSFS 组件,并且必须正确配置目标服务器以使其能够写入主机 FS 上的特定目录。使用 TSFS 的测试对象产生的结果存储在此目录下;要阅读它们,您必须调整“加载测试结果-文件”测试配置以指向适当的结果文件(请参见Customizing Test Configurations through Test Flow Recipes)。
- Socket - 它们使用网络套接字在目标和主机之间传输测试结果。使用特殊的侦听器来接收它们。必须在用于运行应用程序的 VxWorks 映像中正确启用和初始化网络和套接字组件。可以使用默认的 加载测试结果(文件) 测试配置来读取结果。
- 应用程序 - 使用应用程序的默认入口点在应用程序模式下测试应用程序,而不是执行单元测试。
- 内存监控 - 它们对经过测试的应用程序执行内存分析。有关使用 C++test 执行运行时错误检测的一般信息,请参见 运行时错误检测。
您可能需要的其他内置测试配置是:
- "单元测试> 生成单元测试"
- "实用程序> 使用外部库符号生成桩函数"
请确保使用它代替 "单元测试> 生成桩函数” - “嵌入式系统> Wind River> 从 VxWorks 映像中提取符号"
如果您需要构建自定义的 VxWorks/VxSim 版本以适合您的需求(例如,对于 C++ 代码,TSFS,网络),请参考《 Tornado 手册》中的说明。
有关测试配置的更多信息,请参见配置用于政策的测试配置和规则 。
通过测试流程配方自定义测试配置
对于嵌入式开发人员来说,熟悉单元测试处理流程以及 C++test 应用于源代码的工具链非常重要。这种了解对于构建一个完全按照您期望的稳健流程至关重要。
在不同环境中,大部分流程始终保持不变。在大多数情况下,不应更改流程步骤的顺序和参数。但是,在某些情况下,必须调整一些关键步骤。您可以使用【测试配置】管理器中的编辑器来配置测试执行流参数以适合您的特定需求。通常情况下,无需创建执行流的自定义版本,因为内置的【测试配置】可以轻松编辑最关键且经常修改的流属性。
有关如何自定义测试流程的详细信息,请参见 自定义测试执行流。
在极少数情况下,可能需要更高级的自定义。在这种情况下,您可以按照 定义自定义测试执行流中所述定义自定义测试流:Customizing the Test Execution Flow#Defining a Custom Test Execution Flow高级。如果您需要这样做,这里有一些提示和建议:
- 对于所有通信模式(文件,套接字和 rs232),在测试结束时,结果数据必须始终以存储在主机上的运行时日志文件的形式存在。这些将由主机上的 C++test 安装读取。
- 通过文件通信,测试对象本身会生成运行时日志文件。套接字/rs 通信必须涉及在主机上运行的某些侦听器,该侦听器接收和存储从测试对象流式传输的数据。
- TSFS 通信是 C++test 的文件通信类型。I/O 机制超出了工具的范围。
- 以下步骤和属性可能需要审查:
- TestRunnerGenerationStep - 运行时日志文件的路径(目标的视图),属性: testLogFile, covLogFile
- ReadTestLogStep - 测试日志文件(主机)的路径,属性:testLogFile
- ReadDynamicCoverageStep - 覆盖日志文件 (主机)的路径, 属性: covLogFile
调试器测试用例
C++test 在此环境下不支持直接测试用例调试。
使用'hostShell' 将 Test Executable 加载到目标内核,并在所需的测试用例上手动设置断点。