开发人员区域

高级软件开发与MATLAB

半自动测试

最近我在File Exchange和GitHub上做了一些探索,我发现在许多项目的测试中出现了一个小模式。它看起来是这样的:

classdeftestDisk特性地图结束方法(testclasssetup)功能createMap(testCase) opt = sctool.scmapopt(“跟踪”,0,'tol'1 e-12);P = polygon([4 2i -2+4i -3 -3-1i 2-2i]);testCase。地图= diskmap(p,opt);结束结束方法(测试)功能testPlot(testCase)fig=图;绘图(testCase.map,4,3)% <=======就在这里!关闭(图);结束结束结束

plot命令显示并练习此工具箱的图形功能。如果我们只是在测试表单之外运行它,我们可以看到它产生了一个很酷的结果。

opt = sctool.scmapopt(“跟踪”,0,'tol'1 e-12);P = polygon([4 2i -2+4i -3 -3-1i 2-2i]);地图= diskmap (p,选择);图=图;情节(地图,4,3)

顺便说一下,在这个例子中,我从Schwarz-Christoffel工具箱在我看来,这是一个相当不错的包裹!检查用户指南

这个想法很棒,对吧?该项目的开发人员希望了解包的关键功能之一——可视化。至少,测试确实确认了情节代码的执行没有错误,这是一个伟大的步骤。然而,我觉得这可能是一个共同的痛点。我如何验证那些很难验证的东西,比如图像?在我们举起手来之前把桌子翻过来值得注意的是,我们可能有一些选择。我们当然可以访问绘图中的数据,并从数字上确认它是按预期绘制的。我们还可以检查图形原语的属性等等。这都是真的,但我认为这可能会漏掉要点。有时候你只想看看该死的情节!

当情节是对的,当它是错误的时候,你可能完全知道。您可以立即看到微妙的视觉问题,查看它将永远在尝试在测试中进行编码,涵盖您正在使用的每个单个图形原语的每个属性。

让我看看图。

这个测试就是这样做的,但是它会将图形显示在屏幕上,您必须非常仔细地(并且快速地)查看或使用调试工作流来获得真正的洞察力,并确认可视化工作正常。一个更糟糕的选择是把数字打开,永远不关闭它们。每次运行测试时,这都会打乱您的MATLAB环境,并且很难确定每个图形是如何生成的以及用于什么测试。它在CI系统工作流中不起作用。简而言之,它使得验证情节是否正确变得困难,这意味着我们不会验证情节是否正确。

知道我们能做什么吗?我们可以日志!我们可以testcase.log.!我们已经完成了创建这些图形和可视化的艰苦工作。我们为什么不记录下来,以后再看呢?这很简单,因为我们有一个数字不可知论类,它接受图形句柄并将其保存为文件和A..png文件这样我们就可以将它注销,并在测试运行后打开它。如果我们正在验证任何东西(如绘图数据或图形属性),我们也可以使用这些诊断作为我们正在使用的验证或断言方法的诊断输入。对于上面的测试,让我们记录它:

classdeftestDisk特性地图结束方法(testclasssetup)功能createMap(testCase) opt = sctool.scmapopt(“跟踪”,0,'tol'1 e-12);P = polygon([4 2i -2+4i -3 -3-1i 2-2i]);testCase。地图= diskmap(p,opt);结束结束方法(测试)功能testPlot (testCase)导入matlab.unittest.diagnostics.diagnostics;进口matlab.unittest.diagnostics.FigureDiagnostic;图=图;%让我们使用AddTeardown,因为https://blogs.mathworks.com/developer/2015/07/27/addteardown/testcas.addteardown(@close,fold);绘图(TestCase.map,4,3);%现在我们记录它的乐趣和利润。日志(3,...诊断连接(请确认左下方有同心凸集...FigureDiagnostic(图)));结束结束结束

我在那里放了一个很好的描述,所以我们知道我们要在图中寻找什么。我通过将字符串描述与我们的数字不可知论使用诊断.join..此外,我在第3级登录,它对应于详细的水平冗长枚举。这意味着如果我只是运行标准,它就不会出现runtests.电话:

runtests(“测试/ testDisk.m”
运行testDisk……已完成testDisk __________ ans = 1×4 TestResult数组,属性为:Name Passed Failed Incomplete Duration Details总计:4 Passed, 0 Failed, 0 Incomplete. 0.80408 seconds测试时间。

......但如果我在更高级别的日志级别运行:

runtests(“测试/ testDisk.m”“冗长”“详细”
运行testdisk设置testdisk完成设置testdisk在0.01131秒中运行testdisk / testforwardmap在0.0076177秒中运行testdisk / testinversemap完成testdisk / testinversemap在0.0071096秒中运行testdisk / testcenter在0.0082754秒中运行testdisk / testplot [具体实施方式诊断记录(2018-07-30T15:42:18):请确认左下角有同心凸集。数字保存到: - >/私人/ var /文件夹/ bm / 6 qgg87js1bb7fpr2p475bcwh0002wp / T / 094 eb448 - 615 a - 4667 - 95 - e2 - 0 - a6b62b81eae / figure_2d16d47d a44a - 4425 - 9507 - 84 - bb27afcf26.fig-->/private/var/folders/bm/6qgg87js1bb7fpr2p475bcwh0002wp/T/094eb448-615a-4667-95e2-0a6b62b81eae/Figure_2d16d47d-a44a-4425-9507-84bb27afcf26.png完成testDisk/testPlot in 1.3447 seconds tear down testDisk Done tear down testDisk in 0 seconds Done testDisk in 1.379 seconds __________ ans = 1×4 TestResult array with properties: Name Passed Failed Incomplete Duration Details总计:4 Passed, 0 Failed, 0 Incomplete. 1.379 seconds测试时间。

伟大的!现在,我们可以在测试日志中看到指向绘图图像的链接以及图形文件。这很好,但我刚开始。当我们生成测试报告时,让我们看看这个工作流程:

进口matlab.unittest.plugins.TestReportPlugin; runner=matlab.unittest.TestRunner.withTextOutput;runner.addPlugin(TestReportPlugin.producingHTML(“冗长”3) runner.run (testsuite ('测试'))
运行测试迭代次数:32次函数评估次数:91次最终范数(F(x)):1.27486e-09割线方法的重新启动次数:1。。。已完成测试运行testDisk。。。。完成测试磁盘\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。完成测试外部程序运行测试半平面。。。完成测试半平面\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。完成testRectangle\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。完成testStrip生成报告。请稍等。准备报告的内容。向报告中添加内容。将报告写入文件。报告已保存到:/private/var/folders/bm/6qgg87js1bb7fpr2p475bcwh0002wp/t/tp86d8e3a7_aedb_45fa_a82e_0ceb6430ee87/index.html.ans = 1×19 TestResult数组,属性为:Name Passed Failed Incomplete Duration Details总计:19 Passed, 0 Failed, 0 Incomplete。

这是它真正开始变得美丽的地方。现在我们有一份完整的报告,我们可以在我们的闲暇时观看并确认所有可视化是正确的

我们已经运行了整个测试套件并捕获了数据所有的测试不仅仅是这个。我们现在正处于半自动化测试。有些事情确实需要一个人来看看,以确认其正确性。但是,整个测试运行和测试设置仍然可以自动化!这仍然可以通过CI系统完成,因此您不必记得每次更改代码时都要运行测试和查看绘图。您只需让自动化来完成。对于需要手动验证的内容,您可以始终在pdf或html报告中记录工件,并定期或在发布之前进行确认。如果有bug,您可以从所有CI构建中挖掘工件,以查看它是在何时何地引入的。

您甚至可以扩展此方法,将预期的图像添加到报告中。因此,如果您记录一个已知良好的预期映像,然后使用测试代码为每个软件更改生成映像,您可以查看实际映像和预期映像,并确认它们匹配。美丽的。完全自动化测试显然是最理想的,但是在那些您确实需要查看图片的情况下,让框架和您的CI系统为您完成所有设置工作,您可以快速有效地验证它是否正确。

半自动测试快乐!

附注:请查看PDF格式生成的完整报告这里




发布了MATLAB®R2018A

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。