持续集成系统的输出结果
您可以创建与持续集成 (CI) 系统(例如 Jenkins®)兼容的模型测试。要创建与 CI 兼容的结果,请使用 MATLAB® 单元测试运行 Simulink® Test™ 文件。
要运行与 CI 兼容的测试,请遵循以下常规步骤:
从 MLDATX 测试文件创建测试套件。
创建一个测试运行器。
为测试输出或覆盖率结果创建插件。
对于模型覆盖率,使用
ModelCoveragePlugin和CoberturaFormat。以 Cobertura 格式收集模型覆盖率时:Cobertura XML 中仅反映顶层模型覆盖率。
仅反映模型决策覆盖率,并将其映射到 Cobertura XML 中的条件元素。
为 CI 兼容输出创建插件。
将插件添加到测试输出或覆盖率结果中。
将测试输出插件或覆盖率结果插件添加到测试运行器。
运行测试。
测试持续集成系统模型
此示例展示如何通过一次执行来测试模型、发布测试管理器结果以及以 TAP 格式输出结果。
您可以使用 MATLAB® Unit Test 创建测试套件和测试运行器,并使用以下插件自定义运行器:
matlab.unittest.plugins.TestReportPlugin生成 MATLAB Test 报告。sltest.plugins.TestManagerResultsPlugin将测试管理器结果添加到 MATLAB Test 报告中。matlab.unittest.plugins.TAPPlugin将结果输出到 TAP 文件。
测试用例向控制器子系统创建一个方波输入,并扫描参数 a 和 b 的 25 次迭代。该测试将 alpha 输出与容差为 0.0046 的基线进行比较。当输出超出此容差时,测试将在那些迭代中失败。
1.打开 Simulink® Test™ 测试文件。
testfile = fullfile('f14ParameterSweepTest.mldatx');
sltest.testmanager.view;
sltest.testmanager.load(testfile);2.在测试管理器中,配置用于报告的测试文件。
在测试文件选项下,选择执行后生成报告。该部分展开,显示几个报告选项。有关更多信息,请参阅使用测试文件保存报告选项。
3.从 Simulink® Test™ 测试文件创建测试套件。
import matlab.unittest.TestSuite suite = testsuite('f14ParameterSweepTest.mldatx');
4.创建一个测试运行器。
import matlab.unittest.TestRunner
f14runner = TestRunner.withNoPlugins;5.将 TestReportPlugin 添加到测试运行器。
该插件生成一份 MATLAB Test 报告 F14Report.pdf。
import matlab.unittest.plugins.TestReportPlugin pdfFile = 'F14Report.pdf'; trp = TestReportPlugin.producingPDF(pdfFile); addPlugin(f14runner,trp)
6.将 TestManagerResultsPlugin 添加到测试运行器。
该插件将测试管理器结果添加到 MATLAB Test 报告中。
import sltest.plugins.TestManagerResultsPlugin
tmr = TestManagerResultsPlugin;
addPlugin(f14runner,tmr)7.将 TAPPlugin 添加到测试运行器。
插件输出到 F14Output.tap 文件。
import matlab.unittest.plugins.TAPPlugin import matlab.automation.streams.ToFile tapFile = 'F14Output.tap'; tap = TAPPlugin.producingVersion13(ToFile(tapFile)); addPlugin(f14runner,tap)
8.运行测试。
几次迭代失败,其中信号基线差异超出了容差准则。
result = run(f14runner,suite);
Generating test report. Please wait.
Preparing content for the test report.
Adding content to the test report.
Writing test report to file.
Test report has been saved to:
/tmp/Bdoc25a_2864802_2065572/tp8c740f7e/simulinktest-ex40056435/F14Report.pdf
测试运行器一次执行会生成两份报告:
包含测试管理器结果的 MATLAB Test 报告。
可与 CI 系统一起使用的 TAP 格式文件。
sltest.testmanager.clearResults sltest.testmanager.clear sltest.testmanager.close
持续集成的模型覆盖率结果
此示例展示如何生成用于持续集成的模型覆盖率结果。覆盖率以 Cobertura 格式报告。您使用 MATLAB® Unit Test 运行 Simulink® Test™ 测试文件。
1.从测试文件 AutopilotTestFile.mldatx 导入类并创建测试套件。
import matlab.unittest.TestRunner aptest = sltest.testmanager.TestFile('AutopilotTestFile.mldatx'); apsuite = testsuite(aptest.FilePath);
2.创建一个测试运行器。
trun = TestRunner.withNoPlugins;
3.设置要收集的覆盖率度量。此示例使用决策覆盖率。在 Cobertura 输出中,决策覆盖率被列为条件元素。
import sltest.plugins.coverage.CoverageMetrics cmet = CoverageMetrics('Decision',true);
4.设置覆盖率报告属性。此示例在当前工作文件夹中生成一个文件 R13Coverage.xml。确保您的工作文件夹具有写入权限。
import sltest.plugins.coverage.ModelCoverageReport import matlab.unittest.plugins.codecoverage.CoberturaFormat rptfile = 'R13Coverage.xml'; rpt = CoberturaFormat(rptfile)
rpt = CoberturaFormat with no properties.
5.创建模型覆盖率插件。该插件收集覆盖率度量并生成 Cobertura 格式的报告。
import sltest.plugins.ModelCoveragePlugin mcp = ModelCoveragePlugin('Collecting',cmet,'Producing',rpt)
mcp =
ModelCoveragePlugin with properties:
RecordModelReferenceCoverage: '<default>'
MetricsSettings: [1×1 sltest.plugins.coverage.CoverageMetrics]
ScopeToRequirements: 0
6.将覆盖率插件添加到测试运行器。
addPlugin(trun,mcp) % Turn off command line warnings: warning off Stateflow:cdr:VerifyDangerousComparison warning off Stateflow:Runtime:TestVerificationFailed
7.运行测试。
APResult = run(trun,apsuite)
APResult =
TestResult with properties:
Name: 'AutopilotTestFile > Basic Design Test Cases/Requirement 1.3 Test'
Passed: 0
Failed: 1
Incomplete: 0
Duration: 1.4638
Details: [1×1 struct]
Totals:
0 Passed, 1 Failed, 0 Incomplete.
1.4638 seconds testing time.
8.重新启用警告。
warning on Stateflow:cdr:VerifyDangerousComparison warning on Stateflow:Runtime:TestVerificationFailed
另请参阅
TestRunner | TestSuite | sltest.plugins.ModelCoveragePlugin | sltest.plugins.TestManagerResultsPlugin | matlab.unittest.plugins.TestReportPlugin | matlab.unittest.plugins.TAPPlugin