以编程方式收集代码测试度量
本示例展示了如何以编程方式评估工程中代码测试活动的状态和质量。您可以使用度量 API 收集有关测试状态和覆盖率结果的度量数据,从而评估单元的测试状态。收集度量结果后,您可以访问结果或将结果导出为文件。通过运行收集这些度量的脚本,您可以自动分析工程的测试状态,例如,用于设计持续集成系统。当您对工程中的工件进行更改时,可以使用这些结果来监控测试的完整性或检测下游测试的影响。
运行模型和代码测试
打开一个包含模型和测试工件的工程。对于此示例,在 MATLAB® 命令行窗口中,输入:
openExample("slcheck/ExploreTestingMetricDataInModelTestingDashboardExample"); openProject("cc_CruiseControl");
digitalthread.settings 中将 ToolOutputTracking 属性指定为 true 来启用工件跟踪功能。有关信息,请参阅利用数字线程监控工件可追溯性并检测过时结果。在这个示例中,通过输入以下命令,先在 Normal 模式下运行一个测试用例,然后再在 Software-in-the-loop (SIL) 模式下运行:
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(tc3,SimulationMode='Normal'); run(tc3,SimulationMode='Software-in-the-loop (SIL)');
收集工程中软件单元的度量结果
为当前工程创建一个 metric.Engine 对象。
metric_engine = metric.Engine();
更新 metric_engine 的追溯信息,以反映待处理的工件更改并跟踪测试结果。
updateArtifacts(metric_engine);
为要收集的度量创建一个度量标识符数组。在本例中,通过将 Dashboard 指定为 "ModelUnitSILTesting",创建 SIL 代码测试仪表板中使用的度量标识符列表。有关详细信息,请参阅 getAvailableMetricIds。
metric_Ids = getAvailableMetricIds(metric_engine,... App="DashboardApp",... Dashboard="ModelUnitSILTesting");
执行度量引擎以收集度量结果。
execute(metric_engine,metric_Ids);
ArtifactScope 参量指定单元。有关详细信息,请参阅 execute。访问结果
收集度量结果后,您可以通过编程方式访问结果,或者生成报告以供离线查看。
以编程方式查看测试和覆盖率结果
要以编程方式访问结果,请使用 getMetrics 函数。该函数返回包含指定单元和度量的结果数据的 metric.Result 对象。此示例会将度量 slcomp.sil.TestStatusDistribution 和 slcomp.sil.CoverageBreakdown 的结果存储在对应的数组中。
results_silTests = getMetrics(metric_engine,"slcomp.sil.TestStatusDistribution"); results_silCoverage = getMetrics(metric_engine,"slcomp.sil.CoverageBreakdown");
度量 slcomp.sil.TestStatusDistribution 返回通过、失败、禁用、未运行或未测试的测试数量的分布情况。在这个示例中,单位 cc_DriverSwRequest 的分布值在 results_silTests(4).Value 中。您的计算机上,结果中单位的顺序可能有所不同。
results_silTests(4).Value
ans =
struct with fields:
BinCounts: [5×1 double]
BinEdges: {5×1 cell}
OverallCount: 10
Ratios: [5×1 double]disp 函数显示分布的 bin 计数,这些计数是 metric.Result 对象的 Value 字段中的字段。disp(['Unit: ',results_silTests(4).Scope(1).Name]) disp([' ',num2str(results_silTests(4).Value.BinCounts(1)),' SIL tests failed']) disp([' ',num2str(results_silTests(4).Value.BinCounts(2)),' SIL tests passed']) disp([' ',num2str(results_silTests(4).Value.BinCounts(3)),' SIL tests disabled']) disp([' ',num2str(results_silTests(4).Value.BinCounts(4)),' SIL tests not run']) disp([' ',num2str(results_silTests(4).Value.BinCounts(5)),' SIL tests untested'])
Unit: cc_DriverSwRequest 0 SIL tests failed 1 SIL tests passed 0 SIL tests disabled 9 SIL tests not run 0 SIL tests untested
cc_DriverSwRequest,一项 SIL 测试失败,六项 SIL 测试尚未运行。为了使代码测试结果符合要求,每一项测试都应该通过。如果一个或多个测试尚未运行、未经测试、已禁用或失败,则应在分析代码覆盖率结果之前解决这些问题。有关如何解决此示例工程中的测试失败的信息,请参阅 识别并解决代码测试结果和覆盖率中的不足之处。度量 slcomp.sil.CoverageBreakdown 返回每种覆盖率类型的已达到、已申述、已完成或遗漏的覆盖率百分比。在本例中,单元 cc_DriverSwRequest 的覆盖率结果在 results_silCoverage(4) 中:
results_silCoverage(4).Value
ans =
struct with fields:
Statement: [1×1 struct]
Decision: [1×1 struct]
Condition: [1×1 struct]
MCDC: [1×1 struct]
Function: [1×1 struct]
FunctionCall: [1×1 struct]metric.Result 对象的 Value 字段中的字段访问每种覆盖率类型的结果。例如,要访问该单元的 SIL 决策覆盖率结果:decisionCoverage = results_silCoverage(4).Value.Decision
decisionCoverage =
struct with fields:
Achieved: 48.4848
Justified: 0
Missed: 51.5152
AchievedOrJustified: 48.4848cc_DriverSwRequest,到目前为止,SIL 测试实现了 48% 的决策覆盖率,但漏掉了 52% 的决策覆盖率。为了使代码覆盖率结果符合要求,每种覆盖率类型的 100% 测试结果都应该达到或得到合理的证明。当每种覆盖率类型的覆盖率结果都已实现或得到证明时,仪表板会将覆盖率视为已完成。生成离线审核报告
生成一份报告文件,其中包含工程中每个单元的 SIL 测试结果。对于此示例,指定 HTML 文件格式,使用 pwd 提供当前文件夹的路径,并将报告命名为 "SILResultsReport.html"。
reportLocation = fullfile(pwd, "SILResultsReport.html"); generateReport(metric_engine,Type="html-file",Location=reportLocation,Dashboard="ModelUnitSILTesting");
要打开目录并导航到每个单元的结果,请点击报告左上角的菜单图标。报告中每个单元都包含 SIL 测试结果和覆盖率结果的摘要。

有关该报告的更多信息,请参阅 generateReport。
通过将度量结果保存在报告文件中,您可以在不打开工程和仪表板的情况下访问结果。您也可以打开仪表板来查看结果和探索工件。在 MATLAB 命令行窗口中,输入:
modelTestingDashboard
另请参阅
metric.Engine | execute | generateReport | getAvailableMetricIds | updateArtifacts