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

5 投票
3 回答
1036 浏览
提问于 2025-04-15 13:14

我们有一个Python项目,想用buildbot来开始测试。它的单元测试包括一些只在特定平台上能运行的测试。所以,我们有一些测试是所有平台都能通过的,有些测试只在一个特定的平台上能运行,还有一些测试是在A、B、C平台上能通过的,另外一些则是在B和D平台上能通过的。

那么,最好的做法是什么呢?简单的测试套件会很麻烦,因为每个测试可能有不同的平台要求。我想到了添加“@run_on”和“@ignore_on”这样的装饰器,用来匹配测试方法和平台。还有没有更好的办法呢?

3 个回答

0

听起来这是一个很方便的测试加载器。

你可以看看这个链接: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" 这个名字。

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

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

3

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

import sys
import unittest

if 'win' in sys.platform:
    class TestIt(unittest.TestCase):
        ...

if 'linux' in sys.platform:
    class TestIt(unittest.TestCase):
        ...
0

我们决定使用装饰器,这些装饰器会利用平台模块和其他工具来检查测试是否应该执行。如果不需要执行测试,它们就会直接让测试通过(不过,我们发现Python 2.7已经在其主干中有一个叫做SkipTest的异常,可以在这种情况下抛出,以忽略这个测试)。

撰写回答