2011-01-09 19 views
18

que tienen la siguiente estructura de directorios:¿Hay alguna manera de controlar cómo pytest-xdist ejecuta pruebas en paralelo?

runner.py 
lib/ 
tests/ 
     testsuite1/ 
       testsuite1.py 
     testsuite2/ 
       testsuite2.py 
     testsuite3/ 
       testsuite3.py 
     testsuite4/ 
       testsuite4.py 

El formato de la batería de pruebas módulos * .py es el siguiente:

 
import pytest 
class testsomething: 
     def setup_class(self): 
      ''' do some setup ''' 
      # Do some setup stuff here  
     def teardown_class(self): 
      '''' do some teardown''' 
      # Do some teardown stuff here 

     def test1(self): 
      # Do some test1 related stuff 

     def test2(self): 
      # Do some test2 related stuff 

     .... 
     .... 
     .... 
     def test40(self): 
      # Do some test40 related stuff 

if __name__=='__main()__' 
    pytest.main(args=[os.path.abspath(__file__)]) 

El problema que tengo es que me gustaría para ejecutar los bancos de pruebas '' en paralelo, es decir, quiero que testsuite1, testsuite2, testsuite3 y testsuite4 comiencen la ejecución en paralelo, pero las pruebas individuales dentro de los testsuites deben ejecutarse en serie.

Cuando uso el plugin 'xdist' de py.test y comienzo las pruebas con 'py.test -n 4', py.test reúne todas las pruebas y equilibra la carga de forma aleatoria entre 4 trabajadores. Esto lleva a que se ejecute el método 'setup_class' cada vez de cada prueba dentro de un módulo 'testsuitex.py' (lo que frustra mi propósito. Quiero que setup_class se ejecute solo una vez por clase y las pruebas se ejecuten en serie allí después).

Esencialmente lo que quiero la ejecución para que parezca es:

 
worker1: executes all tests in testsuite1.py serially 
worker2: executes all tests in testsuite2.py serially 
worker3: executes all tests in testsuite3.py serially 
worker4: executes all tests in testsuite4.py serially 

mientras worker1, worker2, worker3 and worker4 son todos ejecutados en paralelo.

¿Hay alguna manera de lograr esto en el marco 'pytest-xidst'?

La única opción que se me ocurre es dar inicio a procesos diferentes para ejecutar cada conjunto de pruebas individualmente dentro runner.py:

 

def test_execute_func(testsuite_path): 
    subprocess.process('py.test %s' % testsuite_path) 

if __name__=='__main__': 
    #Gather all the testsuite names 
    for each testsuite: 
     multiprocessing.Process(test_execute_func,(testsuite_path,)) 

Respuesta

11

Con PYtest-xdist existe actualmente ningún tipo de "por archivo" o distribución "por serie de pruebas". En realidad, si una distribución por archivo (por ejemplo, las pruebas en un archivo solo será ejecutada por un trabajador a la vez) ya lo ayudaría en su caso de uso, lo animo a que presente un problema con el rastreador de problemas Pytest al https://bitbucket.org/hpk42/pytest/issues?status=new&status=open y enlace volviendo a tu buena explicación aquí.

aplausos, Holger

+5

Para cualquiera que vea este post y se preguntó si se han abierto todas las cuestiones, los problemas son: https://github.com/pytest-dev/pytest/issues/175 y https: // github.com/pytest-dev/pytest/issues/738 –

+4

Y este: https://github.com/pytest-dev/pytest-xdist/issues/7 –

Cuestiones relacionadas