回归检验

作者

Frank Warmerdam

联系方式

Pobox.com上可了解有关Warmerdam的更多信息

作者

Jeff McKenna

联系方式

jmckenna在gatewaygeomatics.com

最后更新

2019-11-25

` msautotest`是一组测试图、数据文件、预期结果图像和测试脚本,旨在使在mapserver上运行一组自动回归测试变得容易。

正在获取'msautotest`

如果您已经按照 流浪者使用 步骤。

` msautotest`可从github获得,并存在于主mapserver存储库中的/mapserver/msautotest/。在Unix上,可以提取如下内容:

git checkout https://github.com/mapserver/mapserver.git

您将注意到在您校检后退出了“msautotest”子目录。

正在运行MSAutoTest

注解

通过msautotest测试的某些功能可能还没有作为MapServer的一部分发布,因此请确保使用MapServer的git测试今天的master。

如果您使用的是如中所述的迷走神经 流浪者使用 所有内容都是根据需要安装和配置的,您可以跳过接下来的三个段落。

autotest需要python版本2(但不需要python映射脚本),因此如果系统中没有python,请获取并安装它。有关python的更多信息,请访问http://www.python.org。大多数Linux系统已经安装了一些版本。

autotest还要求使用mapserver构建的可执行文件,特别是 shp2imglegendmapserv服务scalebar ,它在这些路径中可用。通常可以通过将mapserver构建目录添加到我的路径来完成这一点。

csh:

% setenv PATH $HOME/mapserver:$PATH

bash/sh:

% PATH=$HOME/mapserver:$PATH

通过在msautotest目录中键入'shp2img-v'验证是否可以运行资料::

% shp2img -v
MapServer version 7.6.0-dev OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML
    SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS
    SUPPORTS=SVGCAIRO SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
    SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER
    SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=POINT_Z_M SUPPORTS=PBF
    INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

现在您已经准备好运行测试了。测试被细分为不同的类别,每个类别都作为自己的子目录,例如:

gdal
misc
mspython
php
query
renderers
wxs

要将“gdal”测试CD运行到gdal目录中,并运行run_test.py脚本。

注解

在每个文件夹(“gdal”、“misc”等)中,首先必须运行以下内容,才能下载适当的模式:

python ../pymod/xmlvalidate.py -download_ogc_schemas

Unix::

./run_test.py

注解

lxml

窗户::

python.exe run_test.py

gdal 目录中的结果可能如下所示:

% run_test.py
version = MapServer version 7.0.1 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML
SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO
SUPPORTS=SVG_SYMBOLS SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI
SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER
SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

 Processing: 256color_overdose_cmt.map
     results match.
 Processing: alpha_on_alpha_overlay.map
     results match.
 Processing: simplealpha_plug.map
     results match.
 Processing: ticket_5032_optim_2.map
     results match.
 Processing: rawmode_nodata_resample.map
     results match.
 Processing: nonsquare.map
     results match.
 Processing: 256color_overdose_res.map
     results match.
 Processing: class16_oddscale.map
     results match.

...
Processing: 256color_overdose_cmt.map
    results match.
Test done (100.00% success):
0 tested skipped
85 tests succeeded
0 tests failed
0 test results initialized

一般来说,您希望看到没有测试失败。

正在检查失败

由于大多数MSAutoTest测试都将生成的图像与预期图像进行比较,因此这些测试对不同系统上细微的舍入差异以及FreeType GD和Agg等库中细微的呈现更改非常敏感。所以看到一些失败是很常见的。

然后,需要手动检查这些失败,以查看这些差异是否可以接受,并仅指示舍入/呈现方面的差异,或者它们是否是“真正的”错误。这通常是通过将“result”目录中的文件与“expected”目录中的相应文件进行可视化比较来完成的。最好是在一个允许图像分层的应用程序中完成这一操作,并打开和关闭以直观地突出显示正在更改的内容。Openev可用于此。

背景

MSAutoTest套件最初是由FrankWarmerdam(位于pobox.com的Warmerdam)开发的,他可以与您联系并提出问题。

MSAutoTest套件组织为一系列.map文件。python脚本基本上扫描运行它们的目录中以.map结尾的文件。然后将它们“运行”,结果转储到结果目录中的一个文件中。然后对预期目录中的对应文件进行二进制比较,并报告差异。测试套件的一般原则是:

  • 测试数据应该很小,这样就可以轻松地存储和签出,而无需下载大文件。

  • 测试数据应该完全包含在测试套件中…不依赖外部数据集或需要额外配置的数据库。Postgis和Oracle需要单独的测试机制。

  • 测试应该能够在没有大量用户交互的情况下运行。这与功能演示中描述的dnr测试套件是不同的。

  • 测试机制应该适合于测试相对隔离的许多详细功能。

  • 测试套件不依赖于任何mapscript环境,但是我认为在将来用一些依赖于mapscript的组件扩展测试套件是很有价值的(在mspython目录中有一个开始)。

结果比较

对于shp2img测试,通过处理映射生成的输出文件放在文件results/<mapfilebasename>.png中(无论它是否为png)。因此,当处理gdal/256_overlay_res.map时,输出文件将写入gdal/results/256_overlay_res.png。这与gdal/expected/256_overlay_res.png进行了比较。如果他们不一致,测试失败,并且“错误”的结果文件被留下来进行调查。如果它们匹配,则删除结果文件。如果没有对应的预期文件,则结果文件将移动到预期目录(并报告为“已初始化”测试),以准备提交到CVS。

对于使用run_parms的测试,输出文件名是在run_parms语句中指定的,否则比较也会以类似的方式进行。

文件的初始比较是作为二进制文件比较完成的。如果失败,对于图像文件,将尝试使用gdal-python绑定比较图像校验和。如果gdal python绑定不可用,则会悄悄跳过此步骤。

如果安装perceptualdiff程序(http://pdiff.sourceforge.net/)并且它在路径中,则自动测试将尝试在比较图像时使用它作为最后一个回退。如果发现图像“感知”相同,测试将通过消息“结果图像感知匹配,尽管文件不同”。这可以显著减少在近距离检查时所有意图和目的相同的明显故障的数量。建立感知敌我识别是一个有点麻烦,它会错过一些显著的差异,所以它的使用是混合价值的。

对于非图像结果(如XML和HTML输出),将跳过特殊的图像比较。

需要-处理生成选项

因为mapserver可以使用许多可能的扩展构建,例如对ogr、gdal和proj.4的支持,所以需要让testsuite根据mapserver的配置自动检测应该运行哪些测试。这是通过捕获“shp2img-v”的版本输出并使用其中的各种键来决定可以运行哪些测试来实现的。目录可以有一个名为“all_require.txt”的文件,其中“requires:”行表示目录中所有测试所需的组件。如果不满足这些要求中的任何一个,则此目录中根本不会运行任何测试。例如,gdal/all_require.txt列表:

REQUIRES: INPUT=GDAL OUTPUT=PNG

另外,单独的.map文件可以有附加的需求,用requires表示:mapfile中的comment。如果不满足要求,将跳过映射(并在摘要中作为跳过的测试列出)。例如,gdal/256_overlay_res.map有以下几行指示它需要投影支持(除了目录中所有文件所需的输入=gdal和输出=png之外):

# REQUIRES: SUPPORTS=PROJ

运行_parms:不使用shp2img的测试

还有一个run-parms关键字,可以放在 Mapfile 中覆盖一系列行为。默认行为是使用shp2img处理 Mapfile ,但可以请求其他程序,如mapserv或scalebar,并更改各种命令行参数以及输出文件的名称。例如,misc/tr_scalebar.map中的以下行指示输出文件应称为tr_scalebar.png,命令行应类似于“[scalebar][map file][result]”,而不是默认的“[shp2img]-m[map file]-o[result]”。

RUN_PARMS: tr_scalebar.png [SCALEBAR] [MAPFILE] [RESULT]

要像从HTTP请求中进行测试一样,使用run-parms和程序[mapserv]以及query-string参数,结果将重定向到文件。

# RUN_PARMS: wcs_cap.xml [MAPSERV] QUERY_STRING='map=[MAPFILE]&SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCapabilities' > [RESULT]

对于生成通常以内容类型头作为前缀的图像的web服务,使用 [RESULT_DEMIME] 指示测试harnas在进行比较之前脚本关闭任何http头。这对于图像结果特别有价值,因此可以使用特殊的图像比较来比较文件。

# Generate simple PNG.
# RUN_PARMS: wcs_simple.png [MAPSERV] QUERY_STRING='map=[MAPFILE]&SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&WIDTH=120&HEIGHT=90&FORMAT=GDPNG&BBOX=0,0,400,300&COVERAGE=grey&CRS=EPSG:32611' > [RESULT_DEMIME]

结果文件预处理

如上所述,[resultu demime]指令可用于从Web服务输出图像文件(即wms getmap请求)。

对于文本、XML和HTML输出,将其他预处理应用于输出文件也会有所帮助,以便于进行比较。run_parms中的[result_deversion]指令将对输出文件应用多个翻译,包括:

  • 去掉mapserver版本字符串,该字符串根据构建选项和版本进行更改。

  • 操作指数数字的格式以在不同平台上保持一致(将Windows E+0nn格式更改为E+nn)。

  • 去掉浮点数的最后一个小数点,以避免对平台特定的数字处理产生不必要的敏感。

  • 清除时间戳以避免“当前时间”敏感度。

在某些情况下,删除与特定图案匹配的线条也很有帮助。[strip:xxx]指令删除包含所示子字符串的所有行。如果需要,可以在命令字符串中包含多个[strip:xxx]指令。例如,来自运行时替换验证测试(misc/runtime_sub.map)的错误报告会生成错误消息,其中包含一个绝对路径,每个人的绝对路径都会发生更改。以下指令将删除结果中包含字符串shapefileopen的任何文本行,在这种情况下,这将是错误消息:

# RUN_PARMS: runtime_sub_test001.txt [MAPSERV] QUERY_STRING='map=[MAPFILE]
&mode=map&layer=layer1&name1=bdry_counpy2' > [RESULT_DEVERSION] [STRIP:ShapefileOpen]

如果测试失败怎么办?

在运行测试套件时,一些测试通常会失败,这取决于平台上浮动点的不确定性,或者MapServer中的无害更改。要识别这些差异,请将结果中的结果与预期中的文件进行比较,并确定差异是什么。如果文本或其他功能稍有变化,可能是由于不同平台上的浮点差异所致。这些可以忽略。如果出了严重的问题,那么就找出问题所在!

避免使用特定于平台的输出图像格式也是明智的。例如,如果您生成tiff,它将在big endian系统上生成big endian,因此在二进制级别上与预期的不同。巴布亚新几内亚应该相当安全。

TODO

  • 为不同的东西添加很多测试!矢量测试还很少完成。

  • 在msautotest目录中添加一个高级脚本,该脚本在所有子目录中运行子脚本并生成摘要报告。

  • 添加一些内容以在服务器上运行测试并报告更改。

添加新测试

  • 选择一个合适的目录来放入测试。请随意为新的测试功能系列启动一个新的测试功能。

  • 创建最小 Mapfile 以测试特定问题。我不鼓励从一个“真正的” Mapfile 开始,因为很难将其减少到最小。

  • 给新的 Mapfile 一个名称,提示它正在测试的内容,而不要使名称太长。例如,“ogr_join.map”测试ogr join。rgb_overlay_res_to 8bit.map“通过重新采样和转换为8bit输出测试rgb overlay层。

  • 将任何mapserver功能选项放入Requires:标题中的项,如上面的“内部功能”主题中所述。

  • 在.map文件的顶部写一些注释,说明此测试要检查的内容。

  • 在测试目录下的数据目录中添加任何必需的数据集。这些测试数据集应该尽可能小!尽可能重用现有数据集。

  • 运行“run_tests.py”脚本。

  • 验证新创建的expected/<testname>.png文件是否生成预期的结果。如果没有,请修改映射并重新运行测试,现在检查结果/<testname>.png文件。当您满意时,将结果/<testname>.png文件移到预期的目录中。

  • 当您对.map文件和预期的/<testname>.png文件满意时,将它们添加到存储库中。例如,

% git add mynewtest.map expected/mynewtest.png
% git commit -m "My new test" mynewtest.map expected/mynewtest.png

你完了!