如何分发和执行特定平台的单元测试?
我们有一个Python项目,想用buildbot来开始测试。它的单元测试包括一些只在特定平台上能运行的测试。所以,我们有一些测试是所有平台都能通过的,有些测试只在一个特定的平台上能运行,还有一些测试是在A、B、C平台上能通过的,另外一些则是在B和D平台上能通过的。
那么,最好的做法是什么呢?简单的测试套件会很麻烦,因为每个测试可能有不同的平台要求。我想到了添加“@run_on”和“@ignore_on”这样的装饰器,用来匹配测试方法和平台。还有没有更好的办法呢?
3 个回答
听起来这是一个很方便的测试加载器。
你可以看看这个链接:http://docs.python.org/library/unittest.html#unittest.TestLoader.loadTestsFromName
如果你能制定一些合适的命名规则,可能就能根据你的测试命名来创建测试套件。
假设我有测试 A,它可以在 AIX、Linux(所有版本)和 32 位 Windows 上运行;测试 B 在 Windows 64、Linux 64 和 Solaris 上运行;测试 C 在除了 HPUX 以外的所有系统上运行;测试 D 在所有系统上都能运行……那我该用什么命名规则呢?
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"
这个名字。
“我们不能有一个正面的操作系统列表。如果我们添加一个新的操作系统,那我们是不是得把每个测试都重命名,以明确包含它?”是的。新的操作系统市场发展缓慢,管理起来并不是那么痛苦。
另一种方法是在每个类中包含信息(比如,一个类级别的函数)或者使用装饰器,并使用一个自定义的类加载器来评估这个类级别的函数。
在几次情况下,我在测试模块中使用了这种非常简单的方法:
import sys
import unittest
if 'win' in sys.platform:
class TestIt(unittest.TestCase):
...
if 'linux' in sys.platform:
class TestIt(unittest.TestCase):
...
我们决定使用装饰器,这些装饰器会利用平台模块和其他工具来检查测试是否应该执行。如果不需要执行测试,它们就会直接让测试通过(不过,我们发现Python 2.7已经在其主干中有一个叫做SkipTest的异常,可以在这种情况下抛出,以忽略这个测试)。