代码之家  ›  专栏  ›  技术社区  ›  sorin

如何在多核机器上加速python单元测试?[复制品]

  •  12
  • sorin  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 15 年前
        1
  •  6
  •   Rohanil    9 年前

    如果您的测试不太复杂,您可以使用 py.test 哪个有 support for distributed testing .如果您没有在Windows上运行,则 nose 也可以为你工作。

        2
  •  5
  •   Joe    12 年前

    这个 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())
    
        3
  •  0
  •   Khelben    15 年前

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

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

    编辑: 此模块包含在2.6版之后

        4
  •  0
  •   Devy    9 年前

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

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

    假设每个单元测试用例都需要独立的数据库模式+数据设置,那么您不能仅在CPU上扩展执行速度,而只能通过单个测试数据库连接到单个测试数据库服务器来限制执行速度(否则,在并行执行每个测试用例时,数据的状态可能会相互干扰,以此类推)第四)。