2010-06-24 18 views
7

J'ai un répertoire avec beaucoup de fichiers .py (disons test_1.py, test_2.py et ainsi de suite) Chacun d'eux est écrit correctement pour être utilisé avec le nez. Donc quand j'exécute un script de nosetests, il trouve tous les tests dans tous les fichiers .py et les exécute. Je veux maintenant les paralléliser afin que tous les tests dans tous les fichiers .py soient traités comme étant parallélisables et délégués aux processus de travail.Obtenir des tests pour paralléliser en utilisant le nez en python

Il semble que, par défaut, faire:

nosetests --processes=2 

introduit pas de parallélisme à tous et tous les tests dans tous les fichiers .py fonctionnent toujours dans un seul processus

J'ai essayé de mettre un _multiprocess_can_split_ = True dans chacun des fichiers .py mais cela ne fait aucune différence

Merci pour toutes les entrées!

+0

Comment déterminez-vous si elle parallélise du tout? J'ai un but similaire mais je * pense * J'ai un problème différent de vous ... peut-être pas, cependant. – fholo

Répondre

12

Il semble que le nez, en fait le plugin multiprocessus, fera fonctionner le test en parallèle. La mise en garde est que la façon dont cela fonctionne, vous pouvez finir par ne pas exécuter le test sur plusieurs processus. Le plugin crée une file d'attente de test, génère plusieurs processus et chaque processus consomme la file d'attente simultanément. Il n'y a pas de répartition des tests pour chaque processus, donc si vos tests s'exécutent très rapidement, ils pourraient finir par être exécutés dans le même processus.

L'exemple suivant affiche cette beaviour:

Fichier test1.py

import os 
import unittest 

class testProcess2(unittest.TestCase): 

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

Fichier test2.py

import os 
import unittest 

class testProcess2(unittest.TestCase): 

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

Exécution nosetests --processes = 2 sorties (notez le processus identique id)

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) 

Maintenant, si l'on ajoute un sommeil dans l'un des tests

import os 
import unittest 
import time 

class testProcess2(unittest.TestCase): 

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

Nous obtenons (remarquez les différents ID de processus)

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)