合并覆盖率数据时出现的问题诊断
本示例展示了如何使用 slcoverage.showDataMergeIssues 函数诊断测试用例中导致覆盖率聚合失败的情况。
在 Simulink® 测试管理器中打开测试用例
打开 Simulink Test 管理器并加载测试用例。
sltest.testmanager.view;
testFile = sltest.testmanager.load("slcovRbMergeTests.mldatx");slcovRbMerge 模型包含两个 Constant 模块和一个 Relational Operator 模块。该模型比较常量并将结果以布尔值的形式输出。slcovRbMergeTests 测试文件包含一个测试套件中的两个测试。这两个测试用例分别分析了模型的决策边界和关系边界覆盖率。第一个测试用例,使用 double 的 RelBound,分析了默认数据类型 double 的覆盖率;第二个测试用例,使用 int8 的 RelBound,将两个 Constant 块更改为输出整数数据类型。
运行测试套件
单击测试套件关系边界测试套件,然后单击运行,即可运行测试用例。或者,输入:
testResults = run(testFile);
在 Simulink Test 管理器中,在结果和工件窗格中,展开结果并选择 slcovRbMergeTests。在汇总覆盖率结果部分,slcovRbMerge 模型有两行数据。

诊断 Simulink Test 管理器中的覆盖率聚合问题
当您对一个模型运行多个测试时,Simulink Test 管理器会尝试合并两个测试的覆盖率数据。当覆盖率数据不兼容且覆盖率数据合并失败时,汇总覆盖率结果部分将显示同一模型的两行或多行数据。Simulink Test 管理器显示同一模型的两行数据,表示这些测试用例的覆盖率数据不兼容,无法聚合。要诊断为什么这些测试用例会生成不兼容的覆盖率数据,请使用 slcoverage.showDataMergeIssues函数。您可以不带任何输入参数调用此函数来分析加载到 Simulink Test 管理器中的结果,或者将结果集对象作为输入参量提供给该函数。
slcoverage.showDataMergeIssues(testResults);
-----------------------------------------------------------
-- Simulink Test Manager Coverage Incompatibility Report --
-----------------------------------------------------------
RESULT SET: 'Results: 2026-Apr-19 12:17:52'
SUMMARY
The analyzed result set contains duplicate coverage rows for the following items:
(1) Analyzed Model: 'slcovRbMerge', Sim Mode: 'Normal', Release: 'R2026a'
-----------------------------------------------------------
DETAILS for slcovRbMerge - Normal - R2026a
2 coverage results were found with the same AnalyzedModel/SimMode/Release but different checksums.
Source of each aggregated coverage result:
The following tests contributed to cov result version 1:
* Results: 2026-Apr-19 12:17:52/slcovRbMergeTests/Relational Boundary Test Suite/RelBound with doubles
The following tests contributed to cov result version 2:
* Results: 2026-Apr-19 12:17:52/slcovRbMergeTests/Relational Boundary Test Suite/RelBound with int8
Cause of differences:
Coverage result version 1 is incompatible with version 2 due to the following:
[Issue 1]
Block: slcovRbMerge/Relational Operator
➔ Different number of Relational Boundary objective outcomes.
Counts (this item only): 2 vs 3
Counts (including descendants): 2 vs 3
由于这两个测试使用了不同的数据类型,因此这两个测试中的关系边界目标数量也不同。因此,您无法汇总这两个测试用例的覆盖率数据。有关关系边界覆盖率的详细信息,请参阅关系边界覆盖率。一些解决方案包括:
修改测试用例,使数据类型保持不变。
如果不需要关系边界覆盖率度量的结果,请将其关闭。
如果多个测试用例对 Simulink Test 管理器中的一行覆盖率结果有所贡献,则它们会以列表的形式出现在 slcoverage.showDataMergeIssues 报告中。如果同一模型有两行以上数据,则分析会将第一行与之后每一行进行比较。例如,如果有三行数据,分析不会比较第二行和第三行。
诊断 cvdata 对象中的覆盖率聚合问题
您还可以将 slcoverage.showDataMergeIssues 与 cvdata 对象输入参数一起使用。首先,使用 Simulink.SimulationInput 对象设置覆盖率分析,然后使用 sim 函数分析覆盖率。本示例未使用测试框架。如果您使用的是测试框架,则必须更改测试框架上的覆盖率设置,而不是在测系统的覆盖率设置。
load_system("slcovRbMerge") simIn1 = Simulink.SimulationInput("slcovRbMerge"); simIn1 = setModelParameter(simIn1,"CovEnable","on"); simIn1 = setModelParameter(simIn1,"CovSaveSingleToWorkspaceVar","on"); simIn1 = setModelParameter(simIn1,"CovMetricRelationalBoundary","on"); simOut1 = sim(simIn1);
从 Simulink.SimulationOutput 对象中获取覆盖率数据。
covData1 = simOut1.covdata;
在第二次仿真中,将 Constant 块更改为输出整数,并再次仿真该模型。
simIn2 = simIn1; simIn2 = setBlockParameter(simIn2,"slcovRbMerge/Constant1","OutDataTypeStr","int8"); simIn2 = setBlockParameter(simIn2,"slcovRbMerge/Constant2","OutDataTypeStr","int8"); simOut2 = sim(simIn2); covData2 = simOut2.covdata;
现在,使用这两个 cvdata 对象作为输入参数调用 slcoverage.showDataMergeIssues。
slcoverage.showDataMergeIssues(covData1,covData2);
-----------------------------------
-- CVDATA Incompatibility Report --
-----------------------------------
[Issue 1]
Block: slcovRbMerge/Relational Operator
➔ Different number of Relational Boundary objective outcomes.
Counts (this item only): 2 vs 3
Counts (including descendants): 2 vs 3
分析报告显示,这两个测试在关系边界目标结果的数量上存在差异。
另请参阅
slcoverage.showDataMergeIssues | cvdata