BullsEye代码覆盖率

时间:2012-07-19 05:12:27

标签: c arm code-coverage

有人可以告诉我如何在手臂处理器上执行代码覆盖率分析吗?

我可以通过编写测试用例并在我的计算机上运行它来进行代码覆盖率分析,但是如果不在目标设备(arm处理器)上安装代码覆盖率工具,可以执行覆盖率分析,而代码是在手臂处理器上运行?

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

1 个答案:

答案 0 :(得分:2)

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

您需要以下内容:

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

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

  1. 根据开发系统编写代码并编译它。
  2. 将目标文件导出到嵌入式系统。
  3. 运行您的嵌入式应用程序,以您认为合适的任何方式执行测试
  4. 将覆盖数据导出到开发系统
  5. 导入测试覆盖率工具以解释结果。
  6. 我不能说“牛眼”,它确实会做某种仪器。我们的Test Coverage tools涵盖了各种语言(Java,C,C#,C ++等等)并具有所有必需的属性(尽管我无法想象嵌入式PL / SQL应用程序!)。

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

    我们没有规定如何从嵌入式系统导出测试覆盖率向量(TCV),因为这会限制我们的工具可以处理哪些系统。我们提供“标准”导出功能,只需将向量块直接写入开发系统磁盘文件;在开发系统本身进行测试覆盖率收集时,导出系统的使用不变(正如您已经表明您已经在某种程度上做了)。导出功能被添加到,与已检测的应用程序一起编译/链接以启用。通常在程序退出时调用它,但您可以在应用程序的任何方便的位置调用它,包括由外部事件触发的点。该工具包含一个交互式组件,该组件将读取此类文件并构建摘要报告,并以交互方式向您显示已执行/未执行的代码。

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

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

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

    我们的客户使用嵌入式系统和C,C ++,C#和Java测试覆盖工具实现了这项技术。