2010-01-15 10 views
12

Estoy usando python unittest para probar alguna otra aplicación externa pero lleva demasiado tiempo ejecutar la prueba una por una.¿Cómo acelerar la prueba unitaria de python en máquinas muticore?

Me gustaría saber cómo puedo acelerar este proceso utilizando la potencia de varios núcleos. ¿Puedo ajustar unittest para ejecutar pruebas en paralelo? ¿Cómo?

Esta pregunta no es capaz de limitar el GIL de Python porque, de hecho, el código python no lleva tiempo, sino la aplicación externa que ejecuto, actualmente a través de os.system().

Respuesta

6

Si sus pruebas no son demasiado complicadas, puede ejecutarlas usando py.test que tiene support for distributed testing. Si no se está ejecutando en Windows, entonces nose también podría funcionar para usted.

+0

py.test se ve muy bien, intentaré ver cómo puedo generar las pruebas dinámicamente. – sorin

+0

por alguna razón py.test no quiere ejecutar bien mi prueba, eche un vistazo a http://bitbucket.org/hpk42/py-trunk/issue/76/distributed-test-do-not-work-with -pytest_generate_tests – sorin

+0

problema informado por "Sorin Sbarnea" se resolvió unos meses más tarde. –

0

Tal vez pueda ejecutar cada prueba en un proceso diferente utilizando la biblioteca multiprocessing. Esto implica que cada prueba unitaria (o grupo de pruebas unitarias) debe ser independiente y no necesita compartir el estado. Abrirá otros procesos y hará uso de otros núcleos.

Comprobar específicamente el 'uso de un grupo de trabajadores' en esta página (http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers)

EDIT: Este módulo se incluye desde la versión 2.6

5

El paquete testtools es una extensión de unittest la que admite la ejecución prueba concurrentemente Se puede usar con las clases de prueba anteriores que heredan unittest.TestCase.

Por ejemplo:

import unittest 
import testtools 

class MyTester(unittest.TestCase): 
    # Tests... 

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester) 
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite)) 
concurrent_suite.run(testtools.StreamResult()) 
+0

Acabo de probar esto con Python 2.7 y no hubo cambios, mis pruebas unitarias todavía se ejecutan en serie. –

0

Como sugiere el @ Vinay-sajip, unos paquetes de Python no básicos como py.test y nose ejecución paralela proporcionado de pruebas de unidad a través de multiprocessing derecho lib fuera de la caja.

Sin embargo, una cosa a tener en cuenta es que si usted está probando una aplicación web con base de datos backend y la mayoría de los casos de prueba se basan en la conexión a la misma base de datos de prueba, entonces su unidad de velocidad de ejecución de la prueba está un cuello de botella en la base de datos no E/S per se. Y usar multiprocess no lo acelerará. Dado que cada caso de prueba requiere una configuración independiente de la base de datos. los datos pueden interferir con otro mientras se ejecuta en paralelo cada caso de prueba, etc., etc.).

Cuestiones relacionadas