Python的unittest能像nose一样并行测试吗?
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类换成一个自己派生的类,这样就能用多进程来运行测试,应该也不会太麻烦。