如何在多核机器上加速python单元测试?

时间:2010-01-15 19:08:22

标签: python multithreading unit-testing performance multicore

我正在使用python unittest来测试其他一些外部应用程序,但是需要花费太多时间来逐个运行测试。

我想知道如何通过使用多核的功能来加速这个过程。 我可以调整unittest来并行执行测试吗?怎么样?

这个问题不能用python GIL限制,因为实际上python代码不需要时间,而是我执行的外部应用程序,目前通过os.system()

4 个答案:

答案 0 :(得分:6)

如果您的测试不太复杂,您可以使用py.test support for distributed testing来运行它们。如果您没有在Windows上运行,那么nose也可能适合您。

答案 1 :(得分:5)

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())

答案 2 :(得分:0)

也许您可以使用multiprocessing库在不同的进程上运行每个测试。这意味着每个单元测试(或单元测试组)应该是独立的,不需要共享状态。 它将打开其他进程,并将使用其他核心。

在此页面上专门检查“使用工作人员池”(http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers

编辑:自2.6版本开始包含此模块

答案 3 :(得分:0)

正如@ vinay-sajip建议的那样,一些非核心的python包如py.testnose提供了开箱即用的multiprocessing lib并行执行单元测试。

但是,需要考虑的一件事是,如果您正在测试具有数据库后端的Web应用程序并且大多数测试用例依赖于连接到同一个测试数据库,那么您的单元测试执行速度就会成为数据库的瓶颈而不是我/ O本身。使用multiprocess不会加快速度。

鉴于每个单元测试用例需要独立设置数据库模式+数据,您不能仅在CPU上扩展执行速度,而是通过单个测试数据库连接限制到单个测试数据库服务器(否则状态为在并行执行每个测试用例等等时,数据可能会干扰其他数据。)