识别并解决代码测试结果和覆盖率中的不足之处
您可以使用 SIL 代码测试和 PIL 代码测试仪表板来识别和解决代码测试结果和覆盖率中的常见问题。完成模型测试后,您可以使用仪表板来评估软件在环 (SIL) 和处理器在环 (PIL) 测试的状态。仪表盘使用度量来衡量测试结果和覆盖率的质量和完整性,并在小组件中汇总度量结果。点击小组件后,您可以查看详细的度量结果,并使用超链接直接打开存在问题的工件。在完成模型测试后,使用模型测试仪表板进行代码测试,以帮助证明软件单元与其关联代码之间的等效性。
本示例展示了如何使用 SIL 代码测试仪表板评估 SIL 测试的状态,但您也可以按照相同的步骤在 PIL 代码测试仪表板中分析 PIL 测试。PIL 代码测试仪表板使用与 SIL 代码测试仪表板相同的布局,但度量结果来自 PIL 测试。
检查模型测试结果的完整性
1.打开一个包含要分析的模型和测试工件的工程。在 MATLAB® 命令行窗口中输入以下代码,打开一个测试结果不完整的示例工程:
openExample('shared_vnv/FixRequirementsBasedTestingIssuesExample') openProject("cc_CruiseControl");
此命令会在示例工程目录中创建仪表板示例工程的副本。示例工程包含多个模型和测试,但不包含任何测试结果。
2.分别在 Normal 和 Software-in-the-Loop (SIL) 模式下运行测试,获取模型和 SIL 代码测试结果。通常情况下,您会在两种仿真模式下运行每个测试。例如,运行以下代码:
% get test case "Detect set" cp = currentProject; rf = cp.RootFolder; tf = fullfile(rf,"tests","cc_DriverSwRequest_Tests.mldatx"); tfObj = sltest.testmanager.load(tf); tsObj = getTestSuites(tfObj); tcObj = getTestCases(tsObj); tc3 = tcObj(3); % run as model test (SimulationMode = 'Normal') run(tc3,SimulationMode='Normal'); % run as code test (SimulationMode = 'Software-in-the-Loop (SIL)') run(tc3,SimulationMode='Software-in-the-loop (SIL)');
该代码从示例工程中获取测试用例 Detect set,使用 Normal 仿真模式运行测试,然后使用 Software-in-the-Loop (SIL) 仿真模式再次运行相同的测试。对于等效性测试(也称为背靠背测试),在模型测试和代码测试环境中使用相同的测试非常重要,因此代码在运行测试用例时只会更改 SimulationMode 参量的值。有关 SimulationMode 参量的更多信息,请参阅 run (Simulink Test)。
3.使用模型测试仪表盘查看模型测试结果状态。要打开仪表板:在工程选项卡上,点击模型测试仪表板或输入:
modelTestingDashboard
您可以使用模型测试仪表板查看工程中每个软件单元的模型测试结果和合规性状态的概述。
模型测试仪表板有四个主要部分:工具栏、工程面板、工件面板和仪表板选项卡。工程面板显示与当前选择的仪表板兼容的当前工程的工件。对于模型和代码测试仪表板,工程面板显示工程中的可用单元。您可以点击工程面板中的某个单元,在仪表板中查看该单元的度量结果。
4.在本例中,查看软件单元 cc_DriverSwRequest 的度量结果。在工程面板中,点击 cc_DriverSwRequest。
模型测试仪表板显示了 cc_DriverSwRequest 的度量结果。在仪表板的仿真测试结果分析部分,在模型测试状态下,可以看到 1 个测试的状态为失败,6 个测试的状态为未运行。在分析代码测试结果之前,通常需要运行每个模型测试并修复失败的结果。但对于这个示例,不要修复失败的测试,继续查看代码测试结果。有关如何使用模型测试仪表板运行测试和修复失败的测试结果的信息,请参阅 修复基于需求的测试问题。
查看代码测试状态并处理不合规结果
1.打开 SIL 代码测试仪表板,查看软件单元 cc_DriverSwRequest 的 SIL 代码测试结果概览。在工具栏的添加仪表板部分,点击 SIL 代码测试。
SIL 代码测试仪表板会在模型测试仪表板的标签页旁边的新标签页中打开。SIL 代码测试仪表板包含两个主要部分:SIL 测试结果和 SIL 覆盖率结果。
在本例中,请注意在 SIL 测试结果部分中,测试摘要小组件显示 0% 的 SIL 测试状态为通过。如果您查看测试状态小组件,可以看到有 1 个 SIL 测试的状态为失败,有 6 个 SIL 测试的状态为未运行。在测试失败下,仅 SIL 和模型小组件显示,0 个 SIL 测试仅在 SIL 代码测试中失败,1 个 SIL 测试在模型测试和 SIL 代码测试中均失败。SIL 代码测试仪表板中的模型小组件显示与模型测试仪表板中的失败小组件相同的度量信息,因此,如果存在任何模型测试失败,您也可以直接从 SIL 代码测试仪表板中查看该信息。
如果 SIL 测试通过率低于 100%,则测试摘要小组件会显示不合规图标
。
2.修复测试失败的根源。在这个示例工程中,Detect set 测试在模型和 SIL 代码测试中均失败,因为模型 cc_DriverSwRequest.slx 使用了错误的枚举值。要解决此问题,请运行以下代码:
load_system(fullfile(rf, "models", "cc_DriverSwRequest.slx")); set_param("cc_DriverSwRequest/Const_reqMode_Set", "Value", "db_Request_Enum.SET") close_system("cc_DriverSwRequest.slx", 1);
代码加载模型,更新值,然后关闭模型。
3.重新运行以下代码来测试模型:
% get test case "Detect set" cp = currentProject; rf = cp.RootFolder; tf = fullfile(rf,"tests","cc_DriverSwRequest_Tests.mldatx"); tfObj = sltest.testmanager.load(tf); tsObj = getTestSuites(tfObj); tcObj = getTestCases(tsObj); tc3 = tcObj(3); % run as model test (SimulationMode = 'Normal') run(tc3,SimulationMode='Normal'); % run as code test (SimulationMode = 'Software-in-the-Loop (SIL)') run(tc3,SimulationMode='Software-in-the-loop (SIL)');
4.在 SIL 代码测试仪表板中,点击收集,并在仪表板中检查更新后的度量结果。
测试摘要小组件显示,目前 14.3% 的 SIL 测试状态为通过。在测试失败下,模型小组件显示,当前模型测试结果中没有失败。

在分析 SIL 覆盖率结果之前,通常需要运行尚未运行的测试,并修复任何失败的测试结果。但对于这个示例,先忽略尚未运行的测试,继续在仪表板中分析结果。
请注意,您还可以分析背靠背测试的状态。有关信息,请参阅 评估软件单元背靠背测试的现状。
识别不合规的覆盖率结果
在 SIL 覆盖率结果部分中,聚合覆盖率小组件显示了从整个单元聚合的语句、决策、条件、MC/DC、函数调用和函数覆盖率。为了符合规定,必须完成 100% 的汇总覆盖率,可以通过代码测试实现覆盖率,或者使用覆盖率过滤器证明覆盖率的合理性。
确定每种覆盖率类型的覆盖范围分别达到、已申述或遗漏的百分比。如果汇总覆盖率小组件显示您缺少覆盖率,请考虑添加更多测试或说明缺少覆盖率的原因。
在这个示例中,请指出条形图中的两个函数调用条形。该单元实现了 55.6% 的功能调用覆盖率,但在 SIL 代码测试中,功能调用覆盖率遗漏了 44.4%。

如果聚合覆盖率小组件显示您缺少函数调用或函数覆盖率,则需要通过运行尚未运行的测试、添加额外的代码测试或证明缺少覆盖率的合理性来解决这些覆盖率差距。函数调用和函数覆盖率是代码测试特有的,没有直接的模型测试等效项可以更改以纠正这种缺失的覆盖率。
调查覆盖率的缺口
要更详细地调查覆盖率差距,请使用覆盖率概览小组件来识别差距并查找模型和代码覆盖率结果中的意外差异。请注意,如果覆盖率已实现或得到证明,则仪表板会将覆盖率视为已完成。
当您阅读覆盖率概览小组件中的表格时:
检查模型测试期间整数溢出覆盖率是否达到 100%。
查看代码覆盖率优于模型覆盖率的覆盖率类型。
检查模型测试期间是否完成了 100% 的模型覆盖率。
查看模型覆盖率优于代码覆盖率的覆盖率类型。
检查代码测试期间是否完成了 100% 的代码覆盖率。
有关覆盖率的详细信息,请参阅评估模型与代码覆盖率之间的差异 (Simulink Coverage)。
识别缺失的整数溢出覆盖率
使用整数溢出行检查模型的整数溢出覆盖率。
覆盖率总结表的第一行显示了在模型和代码测试期间得到证实或完成的整数溢出覆盖率。对于代码测试结果,整数溢出覆盖率始终为 N/A,因为整数溢出覆盖率是模型测试特有的。在本例中,已完成模型列显示 100% 整数溢出覆盖率。

如果整数溢出行显示已完成模型覆盖率低于 100%,则需要运行任何尚未运行的测试、添加模型测试或申述缺失的模型覆盖率。通过模型测试而不是代码测试来解决整数溢出覆盖率的不足。您可以在模型测试仪表板中查看模型测试结果,并使用 Int 排查缺失的整数溢出覆盖率问题。在模型覆盖率小组件中溢出栏。有关详细信息,请参阅使用模型测试仪表板探索测试活动的状态和质量。
找出其他模型覆盖率缺失的来源
找出代码覆盖率优于模型覆盖率的任何覆盖率类型。
已完成的 SIL 列显示已完成的代码覆盖率。

如果某个覆盖率类型的已完成 SIL 百分比大于已完成模型百分比,则代码可能包含一些功能,这些功能可以通过代码测试进行测试,但在模型测试期间没有进行充分测试。例如,在生成代码时,模型可以创建可重用的函数,现有代码测试可以比模型测试更全面地测试这些函数。在这种情况下,您可能需要证明模型覆盖率的申述,或者添加测试来更全面地测试代码中的上游建模结构。
使用已完成模型列检查模型覆盖率状态。
已完成模型列显示了每种覆盖率类型的模型覆盖率的总体状态。在本例中,语句/执行、决策和条件行显示,在模型测试期间,这些覆盖率类型的覆盖率未达到或达到 100%。测试没有收集 MC/DC 覆盖率结果,因此 MC/DC 行显示无数据。

如果已完成模型列显示任何覆盖率类型的覆盖率低于 100%,则需要通过模型测试来审查和解决缺失的覆盖率。您可以在模型测试仪表板中查看模型测试结果,并使用模型覆盖率小组件排查缺失的覆盖率问题。有关详细信息,请参阅使用模型测试仪表板探索测试活动的状态和质量。
在本例中,模型覆盖率暂不完整,继续在仪表板中分析结果。
找出代码覆盖率低于模型覆盖率的地方
假设您添加了测试来解决模型覆盖率不足的问题,并且模型覆盖率列显示了改进的模型覆盖率结果。
检查已完成 SIL 列中的代码覆盖率小于已完成模型列中的模型覆盖率的行。

如果某个覆盖率类型的已完成 SIL 百分比小于已完成模型百分比,则生成的代码中可能存在现有测试未覆盖的功能。例如,如果生成的代码使用代码替换库、查找表或其他特定于代码的功能,则现有的测试可能涵盖了模型,但并未完全测试这些编码结构。您可能需要添加直接测试这些生成的代码结构的测试,或者申述缺少覆盖率的合理性。
找出其他导致代码覆盖率缺失的原因
检查代码覆盖率低于 100% 的行。
已完成 SIL 列显示每种覆盖率类型的代码覆盖率的总体状态。

如果已完成的 SIL 列仍然显示覆盖率低于 100%,请检查已验证的 SIL 和已验证的模型列,看看模型覆盖率的理由是否比代码覆盖率的理由更多。

如果某个覆盖率类型的合理模型百分比大于合理 SIL 百分比,则您可能需要更新覆盖率过滤器,将您在模型覆盖率中所做的理由应用到代码覆盖率中。
查看多个仪表板的结果
查看模型和代码测试仪表板时,将模型测试仪表板选项卡与 SIL 代码测试仪表板选项卡一起打开会很有帮助。
您可以重新排列仪表板选项卡,通过右键点击选项卡并选择全部平铺 > 左/右,将模型测试仪表板选项卡和 SIL 代码测试仪表板选项卡并排显示。

另请参阅
主题
- 查看工程中软件单元的代码测试活动状态
- 评估软件单元背靠背测试的现状
- 以编程方式收集代码测试度量
- 评估模型与代码覆盖率之间的差异 (Simulink Coverage)