1

谁能告诉我如何在手臂处理器上执行代码覆盖率分析?

我可以通过编写测试用例并在我的计算机上运行它们来进行代码覆盖率分析,但是是否有可能在目标设备(ARM 处理器)上不安装代码覆盖率工具的情况下,在代码运行时执行覆盖率分析arm处理器本身?

这将节省大量时间,因为我不会为嵌入式 C 代码中涉及的所有函数和条件显式编写测试用例。

4

1 回答 1

2

我没有具体的手臂经验。我确实有如何在嵌入式系统中收集测试覆盖率数据的经验(作为嵌入式测试覆盖率工具的设计者)。

您需要以下内容:

  • 一种以紧凑格式收集运行时测试覆盖率数据的工具,在嵌入式系统中采用简单且易于定位的结构。
  • 嵌入式系统中的一些额外空间,足以容纳运行时测试覆盖率数据。在一些空间极其有限的嵌入式系统中,这可能是一个问题。
  • 一种导出机制,可以在方便的时候将该数据从嵌入式系统复制到开发系统。
  • 工具中的导入机制,可以接受此类导出的数据

有了这三个元素,您现在可以收集测试覆盖率数据:

  1. 根据开发系统检测您的代码并编译它。
  2. 将目标文件导出到嵌入式系统。
  3. 运行您的嵌入式应用程序,以您认为合适的任何方式执行测试
  4. 将覆盖数据导出到开发系统
  5. 导入测试覆盖工具以解释结果。

我不能说“靶心”,它确实做了某种仪器。我们的测试覆盖率工具涵盖多种语言(Java、C、C#、C++ 等等)并具有所有必要的属性(尽管我无法想象一个嵌入式 PL/SQL 应用程序!)。

我们的工具将测试覆盖率数据存储为密集的布尔字节/位向量块(C 和 C++ 的选择,其他语言的字节向量)。这最大限度地减少了嵌入式系统的额外存储需求。即使这太多了,我们的工具也可以让您收集应用程序较小部分的测试覆盖率数据,并结合结果为整个嵌入式应用程序提供测试覆盖率。作为权衡,您可以运行多个测试,但您至少可以做到,并且脚本可以帮助改善步骤的单调乏味。

我们没有规定如何从嵌入式系统导出测试覆盖向量 (TCV),因为这会限制我们的工具可以处理哪些系统。我们提供了一个“标准”导出功能,可以简单地将向量块直接写入开发系统磁盘文件;在开发系统本身上进行测试覆盖率收集时,该导出系统的使用保持不变(正如您所指出的那样,您已经在某种程度上这样做了)。导出功能被添加到、编译/链接到检测的应用程序以启用使用。通常在程序退出时调用它,但您可以在应用程序中的任何方便点调用它,包括由外部事件触发的点。

在嵌入式上下文中,您将导出函数替换为您自己的函数。它只有大约 50 行代码,所以没有太多可替换的。在大多数嵌入式系统上,都有可用的额外 I/O 端口(并行输出位、串行端口,应有尽有);编写一个例程,将二进制测试覆盖数据检测到该输出位。任何嵌入式工程师都可以轻松编写位串行器或发送字节到串行端口的代码块。此时,可以从嵌入式系统中导出测试覆盖率数据。如果您的嵌入式系统具有文件系统,那么对代码的更改即使不是不存在也是微不足道的。

最后一步是捕获这个比特流。这需要构建一个在开发系统上运行的自定义程序,该程序读取一些可用的硬件输入(串行端口很容易找到,因此很受欢迎)并在内存中重新生成测试覆盖数据的位图。可以将默认导出功能复制到自定义程序中,只需稍作更改即可将此数据移动到磁盘文件中。在这一步之后,测试覆盖交互组件可以读取覆盖数据;它并不关心它来自哪里。

因此,通过对导出过程进行一些自定义,您可以在几乎任意的嵌入式上下文中使用我们的工具。(我们让一位客户使用它来测试嵌入在笔记本电脑电池中的微处理器!)。一位称职的嵌入式工程师大约需要一天的时间来摆弄嵌入式版本的导出功能,以及开发系统驻留部分,然后您就可以尽情收集测试覆盖率了。

我们的客户已经使用我们的 C、C++、C# 和 Java 测试覆盖工具在嵌入式系统中实施了这项技术。

于 2012-07-19T12:49:55.723 回答