Python的unittest能像nose一样并行测试吗?

64 投票
7 回答
51558 浏览
提问于 2025-04-16 10:05

Python的NOSE测试框架有一个功能,就是可以同时运行多个测试

这样做的目的不是为了测试代码的并发性,而是为了让那些“没有副作用、没有顺序问题和没有外部依赖”的代码测试跑得更快。性能提升的原因在于,当这些测试同时等待输入输出时,它们可以访问不同的设备,充分利用多核CPU的能力,同时也能并行运行time.sleep()这样的代码。

我觉得Python的unittest测试框架也可以通过一个插件测试运行器来实现类似的功能。

有没有人有过这样的经验,可以分享一些建议吗?

7 个回答

8

如果你想要并行运行测试,请使用 pytest-xdist

pytest-xdist 插件为 py.test 增加了一些独特的测试执行模式:

  • 测试并行运行:如果你有多个 CPU 或主机,可以利用它们一起进行测试。这可以加快开发速度,或者使用远程机器的特殊资源。

[...]

更多信息请查看: Rohan Dunham 的博客

23

testtools这个包是对unittest的一个扩展,它支持同时运行多个测试。你可以用它来测试那些继承自unittest.TestCase的旧测试类。

举个例子:

import unittest
import testtools

class MyTester(unittest.TestCase):
    # Tests...

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester)
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite))
concurrent_suite.run(testtools.StreamResult())
28

Python的unittest自带的测试运行器不能同时运行多个测试。不过,写一个可以并行运行测试的程序应该不算太难。我自己写了一个,主要是为了重新格式化输出结果和记录每个测试的时间。这大概花了我半天的时间。我觉得你可以把用的TestSuite类换成一个自己派生的类,这样就能用多进程来运行测试,应该也不会太麻烦。

撰写回答