python - tutorial - pytest vs unittest
¿Hay alguna manera de controlar cómo pytest-xdist ejecuta pruebas en paralelo? (1)
Tengo el siguiente diseño de directorio:
runner.py
lib/
tests/
testsuite1/
testsuite1.py
testsuite2/
testsuite2.py
testsuite3/
testsuite3.py
testsuite4/
testsuite4.py
El formato de los módulos de testinguite * .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 ejecutar los ''testsuites'' en paralelo, es decir, quiero que testsuite1, testsuite2, testsuite3 y testsuite4 para iniciar la ejecución en paralelo, pero las pruebas individuales dentro de los testsuites deben ejecutarse en serie.
Cuando uso el complemento ''xdist'' de py.test y comienzo las pruebas con ''py.test -n 4'', py.test está recopilando todas las pruebas y equilibrando la carga aleatoriamente entre 4 trabajadores. Esto lleva al método ''setup_class'' a ejecutarse cada vez que se realiza cada prueba dentro de un módulo ''testsuitex.py'' (que anula mi propósito. Quiero que setup_class se ejecute solo una vez por clase y las pruebas se ejecuten en serie luego).
Esencialmente, cómo quiero que se vea la ejecución 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
se ejecutan en paralelo.
¿Hay alguna manera de lograr esto en el marco ''pytest-xidst''?
La única opción que se me ocurre es iniciar procesos diferentes para ejecutar cada conjunto de pruebas individualmente dentro de 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,))
Con pytest-xdist actualmente no hay ningún tipo de distribución "por archivo" o "por-prueba-suite". En realidad, si una distribución por archivo (p. Ej., Las pruebas en un archivo solo serán ejecutadas por un trabajador a lo sumo) ya ayudaría a su caso de uso, le animo a presentar un problema de características con el rastreador de problemas de pytest en https://bitbucket.org/hpk42/pytest/issues?status=new&status=open y enlace a su buena explicación aquí.
Saludos, Holger