mapscript单元测试

日期

2005-11-20

作者

肖恩吉利斯

备注

这个 msautotest 建议使用基础结构,因为对MapServer存储库的每个提交/拉入请求都会运行该基础结构。

测试驱动开发

2003年,我开始致力于mapscript模块的测试驱动开发。TDD只是指通过重复两项活动来发展:

  1. 添加测试,导致失败,并编写代码以通过测试

  2. 删除重复项

测试驱动开发也是KentBeck的一本书。

我为MapServer开发的新特性从测试表达式开始。以这种方式工作有无数的充分理由。最明显的是

  1. 自动单元测试的累积

  2. 优秀使用案例的积累

  3. 我不能开始研究那些不可检验的古怪想法

关于测试

测试在mapscript/python/tests下提交给mapserver cvs。它们是使用受JUnit启发的UnitTest模块用Python编写的。可以在http://diveintopython.org/unit_testing/index.html上找到关于使用python进行单元测试的很好介绍。

测试框架从python/tests/cases/testing.py导入mapscript。这允许我们在安装之前测试模块

[sean@lenny python]$ python setup.py build
[sean@lenny python]$ python tests/runtests.py -v

测试用例作为Python类实现,单个测试作为以test*开头的类方法。特殊的setup()和teardown()方法用于测试夹具,并在每次单独测试之前和之后调用。

自4.2版以来,mapserver在mapserver/tests下包含了一个非常轻量的测试数据集。该集合由符号、字体、三个单一功能形状文件和一个test.map映射文件组成。这是单元测试使用的唯一数据。

许多需要mapobj的测试都是从testing派生的。maptestcase::

class MapTestCase(MapPrimitivesTestCase):
    """Base class for testing with a map fixture"""
    def setUp(self):
        self.map = mapscript.mapObj(TESTMAPFILE)
    def tearDown(self):
        self.map = None

一个例子是mapsymbolletstcase,我用于开发4.2版本中的扩展符号集功能的测试用例:

class MapSymbolSetTestCase(MapTestCase):
    def testGetNumSymbols(self):
        """expect getNumSymbols == 2 from test fixture test.map"""
        num = self.map.getNumSymbols()
        assert num == 2, num

    ...

状态

这个单元测试框架只涵盖了向python mapscript模块公开的功能。它可以帮助检查核心mapserver代码,但不能保证 MAPSERV公司 程序或 PHP MapScript 模块。在撰写本文时,套件中有159个测试。这些是自2003年年中以来添加的功能测试。MapServer的大部分旧产品还没有经过测试,我们是否有足够的时间来重新填写,这一点值得怀疑。