我正在使用python unittest来测试其他一些外部应用程序,但是需要花费太多时间来逐个运行测试。
我想知道如何通过使用多核的功能来加速这个过程。 我可以调整unittest来并行执行测试吗?怎么样?
这个问题不能用python GIL限制,因为实际上python代码不需要时间,而是我执行的外部应用程序,目前通过os.system()
。
答案 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.test
和nose
提供了开箱即用的multiprocessing
lib并行执行单元测试。
但是,需要考虑的一件事是,如果您正在测试具有数据库后端的Web应用程序并且大多数测试用例依赖于连接到同一个测试数据库,那么您的单元测试执行速度就会成为数据库的瓶颈而不是我/ O本身。使用multiprocess
不会加快速度。
鉴于每个单元测试用例需要独立设置数据库模式+数据,您不能仅在CPU上扩展执行速度,而是通过单个测试数据库连接限制到单个测试数据库服务器(否则状态为在并行执行每个测试用例等等时,数据可能会干扰其他数据。)