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,))
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 –
Y este: https://github.com/pytest-dev/pytest-xdist/issues/7 –