Подтвердить что ты не робот

Как ускорить python unittest на машинах muticore?

Я использую python unittest для тестирования другого внешнего приложения, но для запуска теста один за другим требуется слишком много времени.

Я хотел бы знать, как ускорить этот процесс, используя мощь многоядерных процессоров. Могу ли я настроить unittest для параллельного выполнения тестов? Как?

Этот вопрос не может ограничивать Python GIL, потому что на самом деле не код python занимает время, а внешнее приложение, которое я выполняю, в настоящее время через os.system().

4b9b3361

Ответ 2

Пакет 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

Возможно, вы можете запускать каждый тест в другом процессе, используя библиотеку multiprocessing. Это означает, что каждый unit test (или группа модульных тестов) должен быть независимым и не должен разделять состояние. Он откроет другие процессы и будет использовать другие ядра.

В частности, укажите "Использование пула работников" на этой странице (http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers)

EDIT: Этот модуль включен с версии 2.6

Ответ 4

Как было предложено @vinay-sajip, несколько неосновных пакетов python, таких как py.test и nose, обеспечивали параллельное выполнение модульных тестов через multiprocessing lib прямо из коробки.

Однако стоит обратить внимание на то, что если вы тестируете веб-приложение с базой данных базы данных, и большинство ваших тестовых примеров полагаются на подключение к одной и той же тестовой базе данных, то ваша скорость выполнения unit test является узким местом на БД, а не I/O как таковой. И использование multiprocess не ускорит его.

Учитывая, что для каждого случая unit test требуется независимая настройка схемы базы данных + данных, вы не можете масштабировать скорость выполнения только на CPU, но ограничены одним подключением тестовой базы данных к одному серверу тестовых баз данных (в противном случае состояние данные могут мешать другим другим при параллельном выполнении каждого тестового примера так далее и т.д.).