代码之家  ›  专栏  ›  技术社区  ›  abyx

如何分发和执行平台特定的单元测试?

  •  5
  • abyx  · 技术社区  · 15 年前

    我们有一个python项目,希望开始使用buildbot进行测试。它的单元测试包括只在某些平台上工作的测试。所以,我们有测试应该在所有平台上通过,测试应该只在一个特定的平台上运行,测试应该在平台A、B、C上通过,测试应该在B和D上通过。

    最好的方法是什么?简单的套件会很麻烦,因为如前所述,每个测试可以有不同的目标平台列表。我考虑过添加“@run ou on”和“@ignore ou on”装饰器,它们可以将平台与测试方法相匹配。还有更好的吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   codeape    15 年前

    在一些情况下,我在测试模块中使用了这种非常简单的方法:

    import sys
    import unittest
    
    if 'win' in sys.platform:
        class TestIt(unittest.TestCase):
            ...
    
    if 'linux' in sys.platform:
        class TestIt(unittest.TestCase):
            ...
    
        2
  •  0
  •   S.Lott    15 年前

    对于测试加载器来说,这听起来是个方便的地方。

    退房 http://docs.python.org/library/unittest.html#unittest.TestLoader.loadTestsFromName

    如果您提供一些合适的命名约定,那么您可能可以基于测试命名约定创建套件。

    如果我有在AIX、Linux(all)和32位Windows上执行的测试A,在Windows 64、Linux 64和Solaris上运行的测试B,以及在除HPUX和测试D之外的所有东西上运行的测试C…有什么可能的命名约定?

    class TestA_AIX_Linux2_Win32( unittest.TestCase ):
    
    class TestB_Win64_Linux64_Solaris( unittest.TestCase ):
    
    class TestC_AIX_Linux2_Win32_Win64_Linux64_Solaris( unittest.TestCase ):
    
    class TestD_All( unittest.TestCase ):
    

    最困难的部分是“非HP/UX”。避免消极的逻辑会使你的生活更简单。在这种情况下,只需列出所有非HP/UX操作系统。这个名单相当短,而且增长缓慢。

    “所有”测试只是一个单独的文本搜索,它与当前平台的测试列表合并在一起,以创建一个完整的套件。

    你可以试试

    class TextC_XHPUX( unittest.TestCase ):
    

    您的文本匹配规则通常是 "_someOSName" ;您的异常将是一个奇怪的文本过滤器,用于处理 "_X" 姓名。

    “我们不能有操作系统的正面列表。如果我们添加一个新的操作系统怎么办?是否必须重命名每个测试以显式包含它?”对。新的操作系统市场发展缓慢,管理起来并不那么痛苦。

    另一种方法是在每个类(即类级函数)或装饰器中包含信息,并使用自定义的类装入器来评估类级函数。

        3
  •  0
  •   abyx    15 年前

    我们决定使用decorator,使用平台模块和其他模块,检查是否应该执行测试,如果不简单地让它通过(不过,我们看到python2.7的主干中已经有了一个skipten异常,在这种情况下可能会引发,忽略测试)。