主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

查找并解决覆盖率合并问题

当为模型生成覆盖率结果时,有时您会使用不同的输入信号或参数值多次分析同一个模型。您可以将模型的覆盖率汇总到一份累积覆盖率报告中,该报告总结了针对该模型运行的所有覆盖率仿真的覆盖率。有时,您在此过程中所做的更改可能会导致覆盖率结果与同一模型的其他结果不兼容。

问题

如果您仅使用 Simulink® Coverage™,您可能会多次分析覆盖率,然后使用 + 运算符聚合结果,例如:

covTotal = covData1 + covData2 + ... + covDataN;

如果其中一个覆盖率数据对象与其他对象不兼容,则操作会导致以下错误:

Error using cv.internal.cvdata/checkDataCompatibility
Checksums must match for cvdata operator calculation

Error in +

如果您在 Simulink Test™ 中使用测试管理器,问题会更加微妙,因为测试管理器会在尝试汇总结果之前检查兼容性。如果覆盖率数据不兼容,测试管理器会在覆盖率结果表中将不兼容的运行显示为单独的行。结果是同一模型的覆盖率结果表中有两行或更多行。

例如,在这个示例中,模型 slcoverageVariants聚合覆盖率结果部分出现了两次。

The Aggregated Coverage Results section of the Test Manager displays two rows for the same model.

可能的解决方案

首先调查不兼容的根本原因。确定根本原因后,即可实现解决方案。确定不兼容的根本原因的最简单方法是点击覆盖率结果表中报告列中的箭头,以生成显示相同模型的所有行的覆盖率报告,然后并排比较这些覆盖率报告。

要确定不兼容的根本原因,点击覆盖率结果表的报告列中的箭头,以生成显示相同模型的每一行的覆盖率报告。并排比较结果,寻找可能导致覆盖率结果不兼容的差异。例如,查找具有不同数量覆盖率目标的模块或子系统实例,以达到某个度量或不同的活动变体。请注意,即使覆盖率目标的总数保持不变,变体的改变也可能导致覆盖率结果不兼容。

对于 slcoverageVariants 模型,覆盖率报告在两处有所不同。首先,详细信息部分显示测试用例之间的模块执行覆盖率目标的数量发生了变化。在第一个测试用例中,子系统 Variant_Subsystem 有三个模块执行覆盖率目标,但在第二个测试用例中它有四个执行覆盖率目标。这种差异导致覆盖率结果与聚合不兼容。

此外,覆盖率报告中的测试摘要部分显示两次仿真对 Variant Subsystem 模块的活动选择项不同。

Side-by-side comparison of tests and summary sections of the coverage reports for the two instancesof the model displayed in Test Manager.

改变活动变体选择项会改变两个不同测试用例的覆盖率目标,从而为同一模型创建两组无法聚合的覆盖率数据。如果您不使用测试管理器手动运行这些相同的测试,则求和运算将返回 checksums must match 错误消息。

解决方案 1:测试用例包含不同的活动变体

如果问题在于测试用例有不同的活动变体,则有几种选项可以解决问题:

  • 如果您不想在此测试套件中测试多个活动变体,请使用以下选项之一:

    • 更改测试用例,以便它们对活动变体使用相同的选择。

    • 重新组织测试用例,以便使用每个活动变体选择项的测试分组在一个测试套件中。

  • 将变体的变体激活时间参数更改为启动运行时。这样,测试用例之间的覆盖率目标数量不会发生变化,并且可以聚合覆盖率结果。

    默认情况下,使用启动或运行时激活时间的变体会分析所有变体的选择,即使是在给定仿真期间处于非活动状态的变体。然而,这种选项可能会导致总体覆盖率较低。

有关变体模块覆盖率的更多信息,请参阅变体模块的模型覆盖率

在前面的示例中,将变体激活时间更改为启动可以解决问题。

The Aggregated Coverage Results section of the Test Manager displays one row for the model.

解决方案 2:测试用例改变数据类型

如果您的测试用例收集关系边界覆盖率,则使用测试管理器的参数覆盖部分更改参数的数据类型可能会导致覆盖率不兼容问题。覆盖率目标数量的差异将在受影响模块的关系边界表中显示出来。例如,假设您运行一个仿真,其中 Relational Operator 模块的输入类型为 double,并且运行第二个仿真,其中输入类型为 int8。然后关系边界表为 double 案例显示两行,为 int8 案例显示三行。这些结果对于覆盖率聚合来说不兼容。

The image shows two relational boundary analyzed tables. One table has two rows and the second table has three rows.

要解决关系边界覆盖率结果的差异,请使用以下选项之一:

解决方案 3:测试用例改变数据大小

改变一个或多个信号大小的测试用例可能会导致覆盖率不兼容问题。例如,假设您运行一次仿真,其中 Relational Operator 模块的输入是标量,然后运行第二次仿真,其中输入是 1×2 向量。将输入更改为 1×2 向量会将条件目标的数量从一个增加到两个,将关系边界目标的数量从两个增加到四个。

The image shows two condition and relational boundary analyzed tables. The first condition table has one row, and the first relational boundary table has two rows. The second condition table has two rows, and the second relational boundary table has four rows.

评估信号大小的变化是否是故意的。如果这些变化不是故意的,请调整测试用例以使信号大小不会改变。如果更改是故意的,请使用以下选项之一:

  • 将测试用例分成不同的测试套件,使得每个具有相同信号大小的测试用例都位于一个测试套件中。

  • 考虑使用可变大小的信号。如果您选择使用可变大小的信号,请指定上限大于或等于您在测试期间预期的最大信号大小。有关可变大小信号的更多信息,请参阅可变大小信号基础知识

另请参阅

主题