2010-06-24 12 views
7

Tengo un directorio con muchos archivos .py (digamos test_1.py, test_2.py, etc.) Cada uno de ellos está escrito apropiadamente para ser usado con nose. Entonces, cuando ejecuto el script nosetests, encuentra todas las pruebas en todos los archivos .py y las ejecuta.Obteniendo pruebas para paralelizar usando nose en python

Ahora quiero paralelizarlos para que todas las pruebas en todos los archivos .py se traten como paralelizables y se deleguen a procesos de trabajo.

Parece que, por defecto, haciendo:

nosetests --processes=2 

introduce ningún paralelismo en absoluto y todas las pruebas a través de todos los archivos .py todavía funcionan en un solo proceso de

He intentado poner un _multiprocess_can_split_ = True en cada uno de los archivos .py pero eso no hace ninguna diferencia

¡Gracias por cualquier entrada!

+0

¿Cómo estás determinar si paralelará en absoluto? Tengo un objetivo similar pero creo * Tengo un problema diferente para ti ... posiblemente no. – fholo

Respuesta

12

Parece que la nariz, en realidad el complemento multiproceso, hará que la prueba se ejecute en paralelo. La advertencia es que la forma en que funciona, puede terminar sin ejecutar la prueba en múltiples procesos. El complemento crea una cola de prueba, genera múltiples procesos y luego cada proceso consume la cola al mismo tiempo. No hay despacho de prueba para cada proceso, por lo tanto, si su prueba se ejecuta muy rápido, podrían terminar ejecutándose en el mismo proceso.

El ejemplo siguiente muestra este beaviour:

test1.py File

import os 
import unittest 

class testProcess2(unittest.TestCase): 

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

test2.py File

import os 
import unittest 

class testProcess2(unittest.TestCase): 

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

Correr nosetests --processes = 2 salidas (notar el proceso idéntico 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) 

Ahora bien, si añadimos un sueño en una de las pruebas

import os 
import unittest 
import time 

class testProcess2(unittest.TestCase): 

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

Obtenemos (notar la diferente identificador de proceso)

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) 
Cuestiones relacionadas