开发区域

高级软件开发与MATLAB

逗号分隔的善

大家好,今天我要介绍的是王长青。ChangQing是MATLAB性能框架的首席开发人员,除了他提供的所有出色的性能测试特性外,他还发现了一种非常简单的方法来将性能结果集成到Jenkins中。点击这里查看详情!

内容

基于Jenkins的MATLAB性能测试

“是建筑3301还是建筑3319?”CQ抓着头,满脸困惑。不知何故,他注意到了代码运行时的显著增加,但却不知道是哪一个变化引起的。他希望他已经记录了项目中每一个变更的执行情况。

随着持续集成成为敏捷过程中的关键原则之一,以及越来越多的产品采用持续交付实践,性能测试是添加到工作流中的关键步骤。下载188bet金宝搏CQ从未想过引入性能回归,但当他意识到每次为了修复bug或新特性而接触代码时,都有这样的风险,但为时已晚。“一个通过的构建并不意味着一切都没问题”,CQ思考道,“我如何监控我的MATLAB项目在CI系统上的性能?”

这个问题的答案实际上有两个方面:

  1. 他需要为项目添加性能测试。
  2. 他需要为每个构建安排性能测试运行,并报告结果。

如果你有一个MATLAB项目,想知道如何使用MATLAB中最新(最酷)的测试框架编写性能测试,这个页面这是一个很好的起点。你也可以看看其他博客文章我们过去在这个问题上做了很多努力。在本博客中,我将不详细介绍如何编写性能测试,而是展示一个已经编写了性能测试的示例项目。我用来强调这个例子的项目是一个超轻量的“库”,用于三种不同的矩阵运算,计算给定矩阵的平均值、总和和特征值。

matrix_mean.m

函数= matrix_mean(米)% CQ的矩阵运算库和= matrix_sum (M);nrow = size(M, 1);ncol = size(M, 2);=金额/ (nrow * ncol);结束

矩阵μsum.m

函数out=矩阵和(M)% CQ的矩阵运算库= 0;nrow =大小(M, 1);ncol =大小(M, 2);我= 1:nrowj = 1:ncol out = out + M(i,j);结束结束结束

matrix_eig.m

函数out=矩阵_eig(M)% CQ的矩阵运算库out=根(圆形(多边形(M));结束

tMatrixLibrary.m

classdeftMatrixLibrary < matlab.perftest.TestCase属性(TestParameter)TestMatrix=struct(“中型”,魔法(600),...“慷慨”,magic(1000));结束方法(测试)函数testSum (testCase TestMatrix) matrix_sum (TestMatrix);结束函数testMean (testCase TestMatrix) matrix_mean (TestMatrix);结束函数testEig(testCase,TestMatrix)testCase.assertReturnsTrue(@()大小(TestMatrix,1)=大小(TestMatrix,2),...Eig只适用于方阵);testCase.startMeasuring;matrix_eig (TestMatrix);testCase.stopMeasuring;结束结束结束

性能测试tMatrixLibrary对每个源文件都有三个参数化测试。注意在testig中,我们用anassertTrue保证在测试中通过的矩阵是正方形的,以及启动/停止测量在测试点上指定测量边界。在MATLAB中运行性能测试有多种方法,但最简单的可能是使用运行性能以获得结果。一旦我们有了结果,它很容易得到一个高层次的概述使用样本摘要

结果= runperf (“tMatrixLibrary.m”)结果.样本摘要
运行tMatrixLibrary  .......... .......... .......... .......... .......... .......... .......... ......完成tMatrixLibrary __________ results = 1×6 MeasurementResult数组,属性:Name Valid Samples TestActivity总计:6 Valid, 0 Invalid。ans = 6×7表名SampleSize意味着StandardDeviation最小中值最大  _____________________________________________ __________ _________ _________________ _________ _________ _________ tMatrixLibrary / testSum 7 (TestMatrix =中型)0.0021399 0.00013117 0.0020023 0.0020896 0.0023467 tMatrixLibrary / testSum (TestMatrix = largeSize) 17 0.0082113 - 0.000928460.0050781 0.0084503 0.0095599 tMatrixLibrary/testMean(TestMatrix=midSize) 12 0.0021527 0.00020086 0.0019554 0.0021054 0.002559 tMatrixLibrary/testMean(TestMatrix=largeSize) 8 0.0085206 0.00062801 0.0077265 0.0084615 0.0093073 tMatrixLibrary/ testig (TestMatrix=midSize) 4 0.15444 0.0010901 0.15364 0.15405 0.15604tMatrixLibrary/ testig (TestMatrix=largeSize) 4 0.41783 0.013677 0.40623 0.41421 0.43668

这些都是很好的数字,可以从MATLAB命令窗口评估项目的性能。现在让我们看看如何在CI系统中报告它们。如果我们以Jenkins为例,我们可以创建一个“简单矩阵库”项目,包含上面所示的源代码和测试文件:

作为先决条件,要在Jenkins上记录性能数据,可以使用性能插件詹金斯。插件可以搜索和安装从Jenkins插件管理器. 它使构建后流程能够从主要测试工具捕获报告,然后生成构建历史上的趋势图。此外,它允许根据报告的错误百分比将最新生成状态设置为已通过、不稳定或失败。有几种受支持的报告格式,包括金宝app最终统计数据的XML、JMeter格式、JUnit XML等等。然而,我们为MATLAB项目选择了JMeter CSV格式,因为runperf的输出测量结果对象已经以表格形式存储了信息,正如您将看到的,从这些表格生成JMeter CSV非常简单。具体步骤如下:

步骤1:将性能结果转换为CSV格式

首先,我们将从一个测量结果对象创建一个JMeter CSV文件。首先,我们需要收集所需的信息。标准的JMeter CSV格式包括16个变量:时间戳运行标签responseCoderesponseMessage螺纹名称数据类型成功failureMessage字节sentBytesgrpThreadsallThreads延迟IdleTime,连接.有些变量对我们的用例很重要,有些可以忽略。有四种TestActivity测量结果的表:timeStamp, elapsed(来自“MeasuredTime”),label(来自“Name”)和success(来自“Passed”)。因此,让我们使用上面runperf调用的结果。我们可以将这些列提取到一个samplesTable中,并重命名变量:

activityTable = vertcat (results.TestActivity);activityTable.Properties.VariableNames”
ans = 12×1 cell array {'Name'} {'Passed'} {'Failed'} {'Incomplete'} {'MeasuredTime'} {'Objective'} {'Timestamp'} {'Host'} {'Platform'} {'Version'} {'TestResult'} {'RunIdentifier'}}
samplesTable=activityTable(activityTable.Objective==分类({“样本”}),:); nrows=尺寸(样本表1);%修改表格和变量名以符合JMeter CSV格式samplesTable = samplesTable(:, {)“时间戳”“MeasuredTime”“名字”“通过”});samplesTable.Properties.VariableNames = {“时间戳”“运行”“标签”“成功”};

需要注意的是,JMeter中的时间戳是unix样式的格式,JMeter中报告的经过时间是以毫秒为单位的,这两种情况都不同于MATLAB测量结果。此外,对于失败的情况,我们需要用JMeter中一些可接受的值替换测量结果中缺失的值NaN和NaT。让的地址可以同时处理这两个清理项:

%转换时间戳到unix格式,并填NaT与以前的可用时间samplesTable。时间戳= fillmissing(samplesTable.timeStamp,“以前的”);samplesTable。时间戳= posixtime(samplesTable.timeStamp)*1000;%将MeasuredTime转换为毫秒,并用0填充NaNsamplesTable.Appeased=fillmissing(samplesTable.Appeased,“常数”, 0);samplesTable。运行= floor(samplesTable.elapsed*1000);

“Passed”列默认存储逻辑值,我们需要将它们转换为JMeter CSV的字符串:

将pass/fail逻辑转换为字符串samplesTable。成功= string(samplesTable.success);

接下来,我们需要为其他12个对我们不太重要的变量创建一些默认值,并将它们附加到samplesTable中:

%生成额外的列所需的JMeter CSV格式响应代码=零(nrows,1);responseMessage=字符串(nrows,1);threadName=字符串(nrows,1);数据类型=字符串(nrows,1);failureMessage=字符串(nrows,1);字节=零(nrows,1);sentBytes=零(nrows,1);grpThreads=one(nrows,1);所有线程=一(nrows,1);延迟=零(nrows,1);空闲时间=零(nrows,1);连接=零(nrows,1);auxTable=表(responseCode、responseMessage、threadName、dataType、,...failureMessage、bytes、sentBytes、grpThreads、allThreads、,...延迟、idleTime连接);%将其他列附加到原始表中JMeterTable = [samplesTable, auxTable];

瞧!现在我们有了一个JMeter格式的表格,其中包含完整的16个变量。我们现在可以简单地用writetable函数将其写入CSV文件。注意,字符串是用引号括起来的,以确保测试名称中的逗号不会被视为分隔符。

%将完整表写入CSV文件writetable (JMeterTable“PerformanceTestResult.csv”“QuoteStrings”,对);

步骤2:配置构建和构建后操作

现在我们可以在Jenkins上设置性能监控了!好消息是,经过步骤1中的艰苦工作后,剩下的工作非常简单。只需将我们上面开发的转换代码放入一个函数(我们称之为convertToJMeterCSV)并确保它在Jenkins构建的工作区中可用。然后作为Jenkins构建的一部分调用该函数。打开项目配置页面,添加“执行Windows批处理命令”生成步骤,并将以下内容写入命令:

matlab -nodisplay -wait -log -r "convertToJMeterCSV(runperf('tMatrixLibrary.m'));出口”

runperf的输出将在本地转换并保存为“PerformanceTestResult.csv”。

接下来,点击“添加一个后期构建操作”。在Jenkins上成功安装性能插件后,将出现“发布性能测试结果报告”选项。选择它,并在“Source data files”字段中输入csv文件名。也有其他的选择调整,但我们将保持他们的现状。单击保存按钮,退出配置界面。

步骤3:构建项目并回顾趋势

完成所有操作后,您可以多次构建项目,然后单击左侧的“性能趋势”链接以查看响应时间和错误百分比的趋势图:

请注意,响应时间趋势中的统计信息是在所有测试中计算出来的,这就是为什么中值可能与平均值相差很大的原因。我们可以通过单击任何构建(在本例中为#14),然后单击“性能趋势”链接,来获得趋势的另一个视图:

在这里,我们将看到一个漂亮的汇总表,其中显示了所有测试的统计数据,绿色/红色的指示器显示了与上一个构建版本相比的结果差异。所有未通过的测试都会显示为红色,幸好我们没有这些测试。

这就是我们在Jenkins上为MATLAB项目添加性能报告的方法,不是很简单吗?分享你对如何改进这个过程的想法。对于您的MATLAB项目,您还希望遵循其他性能统计趋势吗?




发布与MATLAB®R2018a

|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。