以编程方式收集模型测试工件的度量
此示例说明如何以编程方式评估工程中基于需求的测试活动的状态和质量。当您使用基于模型的设计开发软件单元时,需要使用基于需求的测试来验证您的模型。您可以通过使用度量 API 收集关于需求和测试之间的可追溯性以及测试结果状态的度量数据,来评估一个单元的测试状态。这些度量衡量基于需求的测试的完整性和质量特征,这些特征反映 ISO 26262 和 DO-178 等行业标准。收集度量结果后,您可以访问结果或将结果导出为文件。通过运行收集这些度量的脚本,您可以自动分析工程的测试状态,例如,用于设计持续集成系统。当您对工程中的工件进行更改时,可以使用这些结果来监控测试的完整性或检测下游测试的影响。
打开工程
打开一个包含模型和测试工件的工程。对于此示例,在 MATLAB® 命令行窗口中,输入:
openExample("slcheck/ExploreTestingMetricDataInModelTestingDashboardExample"); openProject("cc_CruiseControl");
示例工程包含模型以及模型的需求和测试。一些需求具有到模型和测试的可追溯性链接,这有助于验证模型的功能是否满足需求。
示例工程还启用工程设置跟踪工具输出以检测过时结果。在以编程方式收集度量之前,请确保为您的工程启用跟踪工具输出以检测过时结果设置。有关信息,请参阅Monitor Artifact Traceability and Detect Outdated Results with Digital Thread。
收集度量结果
为当前工程创建一个 metric.Engine
对象。
metric_engine = metric.Engine();
更新 metric_engine
的跟踪信息,以反映待定的工件更改并跟踪测试结果。
updateArtifacts(metric_engine);
为要收集的度量创建一个度量标识符数组。对于此示例,创建一个在模型测试仪表板中使用的度量标识符的列表。有关详细信息,请参阅 getAvailableMetricIds
。
metric_Ids = getAvailableMetricIds(metric_engine,... 'App','DashboardApp',... 'Dashboard','ModelUnitTesting');
有关模型测试度量的列表,请参阅Model Testing Metrics。
收集度量结果时,可以一次收集一个单元的结果,也可以收集工程中每个单元的结果。
收集一个单元的结果
当您收集和查看某个单元的结果时,度量返回可追溯至模型的工件的数据。
收集 cc_DriverSwRequest
的度量结果。
创建一个数组,该数组标识工程中模型文件的路径和模型的名称。
unit = {fullfile(pwd,'models','cc_DriverSwRequest.slx'),'cc_DriverSwRequest'};
执行引擎,并使用 'ArtifactScope'
指定要收集结果的单元。引擎只对跟踪到您指定的模型的工件运行度量。收集这些度量的结果需要 Simulink® Test™ 许可证、Requirements Toolbox™ 许可证和 Simulink Coverage™ 许可证。
execute(metric_engine, metric_Ids, 'ArtifactScope', unit)
收集工程中每个单元的结果
要收集工程中每个单元的结果,请执行不带 'ArtifactScope'
的参量的引擎。
execute(metric_engine, metric_Ids)
有关收集度量结果的详细信息,请参阅 execute
函数。
访问结果
生成包含工程中所有单元的结果的报告文件。对于此示例,指定 HTML 文件格式,使用 pwd
提供当前文件夹的路径,并将报告命名为 'MetricResultsReport.html'
。
reportLocation = fullfile(pwd, 'MetricResultsReport.html'); generateReport(metric_engine,'Type','html-file','Location',reportLocation);
要打开目录并导航到每个单元的结果,请点击报告左上角的菜单图标。对于报告中的每个单元,都有一个工件摘要表,显示该单元的大小和结构。
通过将度量结果保存在报告文件中,您可以在不打开工程和仪表板的情况下访问结果。您也可以打开模型测试仪表板来查看结果和探索工件。
modelTestingDashboard
要以编程方式访问结果,请使用 getMetrics
函数。该函数返回包含指定单元和度量的结果数据的 metric.Result
对象。此示例会将度量 slcomp.mt.TestStatus
和 TestCasesPerRequirementDistribution
的结果存储在对应的数组中。
results_TestCasesPerReqDist = getMetrics(metric_engine, 'TestCasesPerRequirementDistribution'); results_TestStatus = getMetrics(metric_engine, 'slcomp.mt.TestStatus');
查看每个需求的测试链接分布
度量 TestCasesPerRequirementDistribution
返回链接到单元的每项功能需求的测试数量的分布。您可以使用 fprintf
函数显示分布的 bin 边界和 bin 计数,它们是 metric.Result
对象的 Value
字段中的字段。每个 bin 的左边界显示测试链接的数量,bin 计数显示链接到该测试数量的需求数量。第六个 bin 边界是 18446744073709551615
,这是每个需求的测试计数的上限,这表明第五个 bin 包含具有四个或更多测试的需求。
fprintf('Unit: %s\n', results_TestCasesPerReqDist(4).Scope(1).Name) fprintf('Number of Tests:\t') fprintf('%d\t', results_TestCasesPerReqDist(4).Value.BinEdges) fprintf('\n Requirements:\t') fprintf('%d\t', results_TestCasesPerReqDist(4).Value.BinCounts)
Unit: cc_ControlMode Number of Tests: 0 1 2 3 4 1.844674e+19 Requirements: 0 15 10 4 1
您的计算机上的结果可能会有所不同,因为结果中单元的顺序可能会有所不同。
在这些示例结果中,对于单元 cc_ControlMode
,有 0 个需求未链接到测试,有 15 个需求链接到一个测试,有 10 个需求链接到两个测试,有 4 个需求链接到三个测试,有 1 个需求链接到四个测试。每个需求都应链接到至少一个测试,以验证模型是否满足需求。该分布还允许您检查是否某个需求具有比其他需求更多的测试,此情形可能表明该需求过于一般,您应将其分解为多个更细粒度的需求。
查看测试状态结果
度量 slcomp.mt.TestStatus
评估单元的每个测试的测试状态,并返回以下数值结果之一:
0
- 失败1
- 通过2
- 禁用3
- 未经测试
显示每个测试的名称和状态。
for n=1:length(results_TestStatus) disp(['Test: ', results_TestStatus(n).Artifacts(1).Name]) disp([' Status: ', num2str(results_TestStatus(n).Value)]) end
对于此示例,测试尚未运行,因此每个测试都返回状态 3
。
另请参阅
Model Testing Metrics | metric.Engine
| execute
| generateReport
| getAvailableMetricIds
| updateArtifacts
相关主题
- Explore Status and Quality of Testing Activities Using Model Testing Dashboard
- Test Model Against Requirements and Report Results (Requirements Toolbox)
- 执行功能测试并分析测试覆盖率 (Simulink Test)