这个例子展示了如何创建一个性能测试和回归测试流
函数。
考虑下面的单元(回归)测试。您可以使用以下命令作为性能测试运行此测试runperf(“fprintfTest”)
而不是runtests(“fprintfTest”)
.
classdeffprintfTest < matlab.unittest.TestCase属性文件支撑材结束方法(TestMethodSetup)函数openFile (testCase) testCase。文件= tempname;testCase。fid = fopen (testCase.file,' w ');testCase.assertNotEqual (testCase.fid 1“IO问题”) testCase.addTeardown (@delete testCase.file);testCase.addTeardown (@fclose testCase.fid);结束结束方法(测试)函数testPrintingToFile(testCase) textToWrite = repmat(“六边形abcdef”, 1, 5000000);流(testCase.fid' % s ', textToWrite);testCase.verifyEqual (fileread (testCase.file)、textToWrite)结束函数testbytestfile (testCase) textToWrite = repmat(“tests_”, 1, 5000000);nbytes =流(testCase.fid,' % s ', textToWrite);testCase.verifyEqual (nbytes长度(textToWrite))结束结束结束
所测量的时间不包括打开和关闭文件或断言的时间,因为这些活动发生在TestMethodSetup
块,而不是在测试
块。然而,测量的时间包括执行验证的时间。最佳实践是度量一个更精确的性能边界。
在文件中创建性能测试,fprintfTest.m
,在当前工作文件夹中。该测试类似于回归测试,只是做了以下修改:
测试继承自matlab.perftest.TestCase
而不是matlab.unittest.TestCase
.
测试调用startMeasuring
和stopMeasuring
方法创建边界流
函数调用。
classdeffprintfTest < matlab.perftest.TestCase属性文件支撑材结束方法(TestMethodSetup)函数openFile (testCase) testCase。文件= tempname;testCase。fid = fopen (testCase.file,' w ');testCase.assertNotEqual (testCase.fid 1“IO问题”) testCase.addTeardown (@delete testCase.file);testCase.addTeardown (@fclose testCase.fid);结束结束方法(测试)函数testPrintingToFile(testCase) textToWrite = repmat(“六边形abcdef”, 1, 5000000);testCase.startMeasuring ();流(testCase.fid' % s ', textToWrite);testCase.stopMeasuring ();testCase.verifyEqual (fileread (testCase.file)、textToWrite)结束函数testbytestfile (testCase) textToWrite = repmat(“tests_”, 1, 5000000);testCase.startMeasuring ();nbytes =流(testCase.fid,' % s ', textToWrite);testCase.stopMeasuring ();testCase.verifyEqual (nbytes长度(textToWrite))结束结束结束
此性能测试的测量时间仅包括调用流
,测试框架仍然评估资格。
运行性能测试。根据您的系统,您可能会看到性能测试框架运行测试的最大次数的警告,但没有达到0.05
a的相对误差幅度0.95
信心水平。
结果= runperf (“fprintfTest”)
运行fprintfTest .......... .......... .完成fprintfTest __________ results = 1×2 TimeResult数组的属性:Name Valid Samples TestActivity总计:2 Valid, 0 Invalid. 4.1417秒测试时间。
的结果
变量是一个1
——- - - - - -2
TimeResult
数组中。数组中的每个元素都对应于测试文件中定义的一个测试。
显示第一次测试的测量结果。结果可能会有所不同。
结果(1)
ans = timerresult with properties: Name: 'fprintfTest/testPrintingToFile' Valid: 1 Samples: [4×7 table] TestActivity: [8×12 table]总计:1 Valid, 0 Invalid. 2.7124秒测试时间。
如尺寸所示TestActivity
属性,则性能测试框架收集8
测量。这个数字包括4
为代码热身的度量。的样品
属性不包括热身测量。
显示第一次测试的样品尺寸。
结果(1)。样品
ans = 4×7表名MeasuredTime时间戳RunIdentifier主机平台版本 ______________________________ ____________ ____________________ ___________ ________ __________________________________________ ____________________________________ fprintfTest / testPrintingToFile 0.067729截止2019年6月24日16:22:09 MY-HOSTNAME win64 9.7.0.1141441 (R2019b)pre - release Update 2 62991eef-5570-47b0-ade5-b8a805245e8f fprintfTest/testPrintingToFile 0.067513 24- june -2019 16:22:09 MY-HOSTNAME win64 9.7.0.1141441 (R2019b) Prerelease Update 26月24日16:22:10 MY-HOSTNAME win64 9.7.0.1141441 (R2019b)预发布更新2
显示第一次测试的平均测量时间。要排除在预热运行中收集的数据,请使用样品
字段。
sampleTimes =结果(1).Samples.MeasuredTime;意味着=意味着(sampleTimes)
意味着= 0.0681
确定所有测试元素的平均时间。的fprintfTest
测试包括两种不同的方法。比较每个方法(测试元素)的时间。
由于性能测试框架返回样品
表,将所有这些表连接到一个表中。然后按测试元素对行进行分组的名字
,并计算均值MeasuredTime
为每个组。
fullTable = vertcat (results.Samples);summaryStats = varfun (@mean fullTable,...“数据源”,“MeasuredTime”,“GroupingVariables”,“名字”)
summaryStats = 2×3表名GroupCount mean_MeasuredTime ______________________________ __________ _________________ fprintfTest / testPrintingToFile 4 0.068139 fprintfTest / testBytesToFile 0.071595 9
这两种测试方法向文件写入相同数量的数据。因此,平均值之间的一些差异归因于调用流
函数带有输出参数。
变更。定义的统计目标runperf
通过构造和运行时间实验来实现。构造一个时间实验,用测量值达到样本均值3%
相对误差范围在97%
信心水平。收集4
热身测量,直到16
样品测量。
构建一个明确的测试套件。
套件= testsuite (“fprintfTest”);
构建一个带有可变数量样本测量值的时间实验,并运行测试。
进口matlab.perftest.TimeExperiment实验= TimeExperiment.limitingSamplingError (“NumWarmups”,4,...“MaxSamples”, 16岁,“RelativeMarginOfError”, 0.03,“ConfidenceLevel”, 0.97);resultsTE =运行(实验套件);
运行fprintfTest .......... ..........警告:在运行MaxSamples for fprintfTest/testPrintingToFile后,目标相对错误幅度未达到。……完成fprintfTest __________
在这个示例输出中,性能测试框架不能满足更严格的统计目标与指定数量的最大样本。结果可能会有所不同。
计算所有测试元素的统计信息。
fullTableTE = vertcat (resultsTE.Samples);summaryStatsTE = varfun (@mean fullTableTE,...“数据源”,“MeasuredTime”,“GroupingVariables”,“名字”)
summaryStatsTE = 2×3表名GroupCount mean_MeasuredTime ______________________________ __________ _________________ fprintfTest / testPrintingToFile 16 0.069482 fprintfTest / testBytesToFile 4 0.067902
将样品的最大数量增加到32
然后重新做时间实验。
实验= TimeExperiment.limitingSamplingError (“NumWarmups”,4,...“MaxSamples”32岁的“RelativeMarginOfError”, 0.03,“ConfidenceLevel”, 0.97);resultsTE =运行(实验套件);
运行fprintfTest .......... ......完成fprintfTest __________
计算所有测试元素的统计信息。
fullTableTE = vertcat (resultsTE.Samples);summaryStatsTE = varfun (@mean fullTableTE,...“数据源”,“MeasuredTime”,“GroupingVariables”,“名字”)
summaryStatsTE = 2×3表名GroupCount mean_MeasuredTime ______________________________ __________ _________________ fprintfTest / testPrintingToFile 4 0.067228 fprintfTest / testBytesToFile 4 0.067766
测试框架实现了两个测试的统计目标4
样本。
开始一个新的MATLAB®会话。新的会话确保MATLAB没有运行测试中包含的代码。
通过创建和运行一个固定时间的实验来度量代码的首次成本,该实验没有预热度量,只有一个示例度量。
构建一个明确的测试套件。由于您正在度量函数的首次成本,因此运行单个测试。要运行多个测试,请保存结果并在测试之间启动新的MATLAB会话。
套件= testsuite (“fprintfTest / testPrintingToFile”);
构建并运行时间实验。
进口matlab.perftest.TimeExperiment实验= TimeExperiment.withFixedSampleSize (1);结果=运行(实验套件);
fprintfTest运行。完成fprintfTest __________
显示结果。观察TestActivity
表中确保无预热样品。
fullTable =结果。TestActivity
fullTable = 1×12表名传递失败不完整MeasuredTime客观时间戳主机平台版本TestResult RunIdentifier ______________________________ ______ ______ __________ ____________ _________ ____________________ ___________ ________ __________________________________________ ____________________________________________________________________ fprintfTest/testPrintingToFile true false false 0.071754 sample 24- june -2019 16:31:27 MY-HOSTNAME win64 9.7.0.1141441 (R2019b) Prerelease Update 2 [1×1 matlab.unittest. txt]TestResult] 045394 eb - e722 - 4241 - 8 da2 - 1 - d17a97ac90a
性能测试框架为每个测试收集一个样本。
matlab.perftest.TestCase
|matlab.perftest.TimeExperiment
|matlab.perftest.TimeResult
|matlab.unittest.measurement.DefaultMeasurementResult
|runperf
|testsuite