7

我最近开始研究一个非常大的 C++ 项目,在完成 90% 的实现后,我确定他们需要在测试期间展示 100% 的分支覆盖率。该项目托管在嵌入式平台(Green Hills Integrity)上。我正在寻找 StackOverflow 上其他在类似环境中使用过代码覆盖率产品的人的建议和经验。我对有关这些类型的工具的正面和负面评论都感兴趣。

4

4 回答 4

5

100% 的分支机构覆盖率?这是非常必要的,特别是因为某些分支(例如状态机的 case 语句中的默认值)不应该运行。我预计会有一些例外情况,如果没有,您可能需要在开始之前了解覆盖测试可以完成和无法完成的任务 - 否则您最终会拉扯头发,或者更糟 - 提供不正确的数据。

大多数嵌入式系统的覆盖测试实际上是在 PC 上执行的。移植代码,在软件中模拟微控制器的某些方面,并运行Bullseye或其他类似的 PC 代码覆盖实用程序。这样做的原因是有太多的微控制器和编译器/调试器/测试环境来为每个开发代码覆盖工具。

当针对特定嵌入式平台的代码覆盖工具确实存在时,它们不如为 PC 平台开发的工具强大、可配置、易于使用和无错误。处理器通常不具备执行良好代码覆盖率所需的跟踪能力(没有高端仿真硬件),而无需在固件中插入额外的调试代码,这会产生难以控制的后果和副作用,尤其是在时序问题的情况下实时系统。

只要您可以抽象出特定于硬件的代码(并且由于您正确使用 C++,这应该很容易,对吧?;-D),移植代码并不是非常困难。您将遇到的最大问题是类型,虽然在 C++ 中比在 C 中更好地指定了类型,但仍然会带来一些问题。确保您使用 types.h 或类似设置来明确告诉编译器您使用的每种类型是什么以及应该如何解释它。

之后,你可以去城里测试PC上的核心逻辑。如果您对开发所需的软件仿真感兴趣,您甚至可以测试低级硬件驱动程序,尽管时间问题可能有些麻烦。

诸如MxVDev之类的软件测试工具会为您执行大量微控制器仿真并帮助解决时序问题,但即使有这样的帮助,您仍然需要做一些工作。

如果您必须在系统本身上执行此操作,则需要为具有覆盖能力的处理器购买仿真器 - 这不是一个便宜的提议(许多仿真器的全套工具和仿真硬件成本超过 3 万美元),但它是在汽车和航空航天工业等高可靠性环境中使用的众多工具之一。

-亚当

免责声明:我为生产 MxVDev 的公司工作。

于 2008-10-16T03:11:55.113 回答
3

我们过去曾使用Cantatavectorcast进行单元测试和代码覆盖。我们还使用 Greenhills 工具,这两个工具都可以与 greenhills 开发工具一起使用。我们在 PPC 模拟器上运行大部分测试,并且仅通过 JTAG pod 运行依赖于目标硬件上的硬件的测试。Canatata 和 Vector cast 与 catata 非常相似,只是更易于使用并且功能稍多一些,但小的附加功能会对用户体验产生很大影响。

通常,如果您想实现高水平的分支覆盖率,您需要设计代码以实现可测试性。你测试的越多,你对编写可测试代码的了解就越多。

我们还尝试了 PC 测试与嵌入式测试,因为字节顺序给我们带来了问题,但这只是硬件层的问题。

此外,这些工具已通过 RTCA/DO-178B 标准认证。

于 2008-11-07T07:54:11.123 回答
2

与 Adam 一样,我们将嵌入式代码移植到基于 PC 的工具上,并在那里进行大部分覆盖和分析。我用过 AutomatedQA AQTime 和 Compuwares DevPartner,这两个都是不错的产品,

如果您必须执行覆盖率,则需要使用覆盖率分析器来创建源的检测版本。有商业和开源工具可以做到这一点,但是 IMO,它增加了很多工作却没有多少收获。

100% 的覆盖率是雄心勃勃的,因为您需要大量的错误注入才能进入所有错误处理程序和异常处理程序。IMO,这在安全带中也比在船上更容易做到。

还值得向任何要求 100% 代码覆盖率的人指出,100% 代码覆盖率绝不等同于 100% 测试覆盖率。例如考虑以下功能;

int div(int a, int b)
{
return (a/b);
}

100% 的代码覆盖率只需要我们调用一次这个函数,100% 的测试覆盖率需要更多的调用。我自己的测试策略包括开发自动化测试用例以提供可接受的测试覆盖率,并使用代码覆盖率工具纯粹作为寻找未测试区域的辅助工具。在某种程度上,这取决于您的测试预算;对我来说,100% 的代码覆盖率对于它所提供的东西来说是昂贵的。

于 2008-10-16T07:21:27.187 回答
0

请参阅SD C++ 测试覆盖率。这是一系列(分支)测试覆盖工具,适用于各种 C++ 方言(ANSI、GNU、MS...),由于占用空间非常小,并且易于使用,因此即使在实际的嵌入式系统硬件中也能很好地发挥作用导出收集的测试覆盖率数据的方法。有一个 GUI 覆盖率显示,它不依赖于您的实际嵌入式硬件,它还将生成完整的覆盖率报告摘要。

[我是提供这些工具的公司的负责人。]

于 2010-05-01T10:28:01.323 回答