回归测试(MSAutotest)

作者

弗兰克·沃默丹

联系

Pobox.com上的Warmerdam

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-04-18

msautotest

正在获取'msautotest`

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

msautotest 可从GitHub获得,并存在于 main MapServer存储库,位于/MapServer/msautotest/中。可以使用类似于::的内容获取它

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

您会注意到一个 msautotest 子目录(内 MapServer )在您结账后仍然存在。

正在运行MSAutoTest

备注

通过msautest测试的一些功能可能还不会作为MapServer的一部分发布,所以一定要针对MapServer的Git中的Main进行测试。

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

MSAutotest可以与Python2或Python3一起运行(但不需要PythonMapScrip),所以如果您的系统上没有安装Python,请获取并安装它。欲了解有关PYTHON的更多信息,请访问https://www.python.org.大多数Linux系统都已安装了某些版本。

MSAutotest还要求使用MapServer生成的可执行文件,特别是 Sp2IMGlegendMAPSERV公司scalebar ,在路径中可用。这可以通过将MapServer构建目录添加到我的路径来实现。

CSH::

% setenv PATH $HOME/mapserver:$PATH

BASH/S::

% 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

从MapServer 7.6开始,您还需要安装 pytest 框架来运行测试。这可以从 msautotest 子目录,带有

pip install -r requirements.txt

备注

PYTEST已经安装在流浪者身上了。

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

gdal
misc
mspython
php
query
renderers
sld
wxs

您只需使用以下命令即可运行所有测试 pytest 从… msautotest 根目录。可以使用pytest的所有标准选项来过滤要运行的测试,或者调整输出的详细程度。

以下自定义选项也可用:

--strict_mode         Strict mode
--valgrind            Run under valgrind
--run_under_asan      Run under ASAN
--renderer=RENDERER

要将“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 -vv

 Cannot validate XML because SCHEMAS_OPENGIS_NET not found. Run "python ../pymod/xmlvalidate.py -download_ogc_schemas" from msautotest/wxs
 Test session starts (platform: linux2, Python 2.7.12, pytest 4.6.6, pytest-sugar 0.9.2)
 cachedir: .pytest_cache
 rootdir: /home/even/mapserver/mapserver/msautotest, inifile: pytest.ini
 plugins: env-0.6.2, random-order-1.0.4, sugar-0.9.2
 collecting ...
  gdal/run_test.py::test[connectionoptions_connectionoptions_png] ✓   1%
  gdal/run_test.py::test[wld_upsidedown_wld_upsidedown_png] ✓         2%
  gdal/run_test.py::test[classtest1_classtest1_png] ✓                 3%
...
  gdal/run_test.py::test[rgb_overlay_plug_rgb_overlay_plug_png] ✓     100%

 Results (23.32s):
       90 passed

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

通过将.map文件名指定为run_test.py脚本的参数,可以运行单个.map文件的测试。

正在检查失败

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

然后需要手动检查这些失败,以查看差异是否可接受,并仅指示舍入/呈现方面的差异,或者它们是否是“真正的”错误。这通常是通过直观地比较“Result”目录中的文件和“Expect”目录中的对应文件来实现的。如果这可以在一个允许图像分层的应用程序中完成,并在视觉上突出显示正在发生变化的内容,这是最好的。QGIS可以用来实现这一点。

背景

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/)),并且该程序位于路径中,则MSAutoTEST将尝试将其用作比较图像时的最后一个备用程序。如果发现图像在“感觉上”相同,则测试将通过,并显示消息“结果图像在感觉上匹配,尽管文件不同”。这可以极大地减少明显的故障数量,而仔细检查,这些故障在所有意图和目的上都是相同的。构建PerceptualDiff有点麻烦,它会忽略一些重要的差异,所以它的使用价值参差不齐。

对于非图像结果(如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关键字,可以放在映射文件中覆盖一系列行为。默认行为是使用shp2img处理映射文件,但可以请求其他程序,如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

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

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

添加新测试

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

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

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

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

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

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

  • 运行“run_est.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

你完了!