Ответ 1
Если ваши тесты не слишком задействованы, вы можете запустить их с помощью py.test, который имеет поддержка распределенного тестирования. Если вы не работаете в Windows, то nose также может работать для вас.
Я использую python unittest для тестирования другого внешнего приложения, но для запуска теста один за другим требуется слишком много времени.
Я хотел бы знать, как ускорить этот процесс, используя мощь многоядерных процессоров. Могу ли я настроить unittest для параллельного выполнения тестов? Как?
Этот вопрос не может ограничивать Python GIL, потому что на самом деле не код python занимает время, а внешнее приложение, которое я выполняю, в настоящее время через os.system()
.
Если ваши тесты не слишком задействованы, вы можете запустить их с помощью py.test, который имеет поддержка распределенного тестирования. Если вы не работаете в Windows, то nose также может работать для вас.
Пакет 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())
Возможно, вы можете запускать каждый тест в другом процессе, используя библиотеку multiprocessing
. Это означает, что каждый unit test (или группа модульных тестов) должен быть независимым и не должен разделять состояние.
Он откроет другие процессы и будет использовать другие ядра.
В частности, укажите "Использование пула работников" на этой странице (http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers)
EDIT: Этот модуль включен с версии 2.6
Как было предложено @vinay-sajip, несколько неосновных пакетов python, таких как py.test
и nose
, обеспечивали параллельное выполнение модульных тестов через multiprocessing
lib прямо из коробки.
Однако стоит обратить внимание на то, что если вы тестируете веб-приложение с базой данных базы данных, и большинство ваших тестовых примеров полагаются на подключение к одной и той же тестовой базе данных, то ваша скорость выполнения unit test является узким местом на БД, а не I/O как таковой. И использование multiprocess
не ускорит его.
Учитывая, что для каждого случая unit test требуется независимая настройка схемы базы данных + данных, вы не можете масштабировать скорость выполнения только на CPU, но ограничены одним подключением тестовой базы данных к одному серверу тестовых баз данных (в противном случае состояние данные могут мешать другим другим при параллельном выполнении каждого тестового примера так далее и т.д.).