Получение тестов для распараллеливания с использованием переноса в python - PullRequest
7 голосов
/ 24 июня 2010

У меня есть каталог с большим количеством файлов .py (скажем, test_1.py, test_2.py и т. Д.). Каждый из них написан правильно для использования с носом. Поэтому, когда я запускаю скрипт для проверки носа, он находит все тесты во всех файлах .py и выполняет их.

Теперь я хочу распараллелить их, чтобы все тесты во всех файлах .py рассматривались как распараллеливаемые и делегированные рабочим процессам.

Похоже, что по умолчанию делают:

nosetests --processes=2 

вообще не вводит параллелизма, и все тесты для всех файлов .py по-прежнему выполняются всего за один процесс

Я попытался поместить _multiprocess_can_split_ = True в каждый из файлов .py, но это не имеет значения

Спасибо за любые комментарии!

1 Ответ

12 голосов
/ 15 сентября 2010

Кажется, что нос, фактически многопроцессный плагин, будет выполнять тестовый запуск параллельно.Предостережение заключается в том, что, как это работает, вы можете не выполнять тестирование для нескольких процессов.Плагин создает тестовую очередь, порождает несколько процессов, а затем каждый процесс использует очередь одновременно.Для каждого процесса тестовая отправка отсутствует, поэтому, если ваш тест выполняется очень быстро, он может закончиться выполнением в одном и том же процессе.

В следующем примере отображается этот beaviour:

Файл test1.py

import os
import unittest

class testProcess2(unittest.TestCase):

    def test_Dummy2(self):
        self.assertEqual(0, os.getpid())

Файл test2.py

import os
import unittest

class testProcess2(unittest.TestCase):

    def test_Dummy2(self):
        self.assertEqual(0, os.getpid())

Запуск тестов носа --processes = 2 выхода (обратите внимание на идентичный идентификатор процесса)

FF
======================================================================
FAIL: test_Dummy2 (test1.testProcess2)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\temp\test1.py", line 7, in test_Dummy2
    self.assertEqual(0, os.getpid())
AssertionError: 0 != 94048

======================================================================
FAIL: test_Dummy1 (test2.testProcess1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\temp\test2.py", line 8, in test_Dummy1
    self.assertEqual(0, os.getpid())
AssertionError: 0 != 94048

----------------------------------------------------------------------
Ran 2 tests in 0.579s

FAILED (failures=2)

Теперь, если мыдобавить сон в один из тестов

import os
import unittest
import time

class testProcess2(unittest.TestCase):

    def test_Dummy2(self):
        time.sleep(1)
        self.assertEqual(0, os.getpid())

Мы получаем (обратите внимание на другой идентификатор процесса)

FF
======================================================================
FAIL: test_Dummy1 (test2.testProcess1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\temp\test2.py", line 8, in test_Dummy1
    self.assertEqual(0, os.getpid())
AssertionError: 0 != 80404

======================================================================
FAIL: test_Dummy2 (test1.testProcess2)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\temp\test1.py", line 10, in test_Dummy2
    self.assertEqual(0, os.getpid())
AssertionError: 0 != 92744

----------------------------------------------------------------------
Ran 2 tests in 1.422s

FAILED (failures=2)
...