¿Cómo organizar la prueba de Python de manera que pueda ejecutar todas las pruebas en un solo comando?

Actualmente mi código está organizado en la siguiente estructura de árbol:

src/ module1.py module2.py test_module1.py test_module2.py subpackage1/ __init__.py moduleA.py moduleB.py test_moduleA.py test_moduleB.py 

Donde el module*.py contiene el código fuente y el test_module*.py contiene el TestCase s para el módulo relevante.

Con los siguientes comandos puedo ejecutar las pruebas contenidas en un solo archivo, por ejemplo:

 $ cd src $ nosetests test_filesystem.py .................. ---------------------------------------------------------------------- Ran 18 tests in 0.390s OK 

¿Cómo puedo realizar todas las pruebas? Intenté con las nosetests -m 'test_.*' Pero no funciona.

 $cd src $ nosetests -m 'test_.*' ---------------------------------------------------------------------- Ran 0 tests in 0.000s OK 

Gracias

Si todos ellos comienzan con la test entonces la test más nosetest debería funcionar. Nariz busca automáticamente cualquier archivo que comience con ‘prueba’.

Si separa o mezcla las pruebas y los módulos es probablemente una cuestión de gusto, aunque yo recomendaría encarecidamente mantenerlos separados (razones de configuración, estadísticas de código, etc.).

Cuando esté utilizando pruebas de detección, asegúrese de que todos los directorios con pruebas sean paquetes reales:

 src/ module1.py module2.py subpackage1/ __init__.py moduleA.py moduleB.py tests/ __init__.py test_module1.py test_module2.py subpackage1/ __init__.py test_moduleA.py test_moduleB.py 

De esta manera, solo puede ejecutar nosetests en el directorio de nivel nosetests y se encontrarán todas las pruebas. Debe asegurarse de que src/ esté en PYTHONPATH ; sin embargo, de lo contrario, todas las pruebas fallarán debido a que faltan importaciones.

No conozco las pruebas de detección, pero puede lograrlo con el módulo de prueba de unidad estándar. Solo necesita crear un archivo test_all.py en su directorio raíz, luego importar todos sus módulos de prueba. En tu caso:

 import unittest import test_module1 import test_module2 import subpackage1 if __name__ == "__main__": allsuites = unittest.TestSuite([test_module1.suite(), \ test_module2.suite(), \ subpackage1.test_moduleA.suite(), \ subpackage1.test_moduleB.suite()]) 

cada módulo debe proporcionar la siguiente función (ejemplo con un módulo con dos pruebas unitarias: Class1 y Class2 ):

 def suite(): """ This defines all the tests of a module""" suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Class1)) suite.addTest(unittest.makeSuite(Class2)) return suite if __name__ == '__main__': unittest.TextTestRunner(verbosity=2).run(suite()) 

Probablemente este sea un tema muy disputado, pero sugeriría que separen sus pruebas de sus módulos. Configurar algo como esto …

Use setup.py para instalarlos en la ruta del sistema (o puede modificar las variables de entorno para evitar la necesidad de un paso de “instalación”).

 foo/ module1.py module2.py subpackage1/ __init__.py moduleA.py moduleB.py 

Ahora, cualquier secuencia de comandos de Python en cualquier lugar puede acceder a esos módulos, en lugar de depender de encontrarlos en el directorio local. Pon tus pruebas a un lado así:

 tests/ test_module1.py test_module2.py test_subpackage1_moduleA,py test_subpackage2_moduleB.py 

No estoy seguro de su comando nosetests , pero ahora que todas sus pruebas están en el mismo directorio, es mucho más fácil escribir un script de contenedor que simplemente importe todas las demás pruebas en el mismo directorio. O si eso no es posible, al menos puede salir con un simple bucle de bash que obtiene sus archivos de prueba uno por uno:

 #!/bin/bash cd tests/ for TEST_SCRIPT in test_*.py ; do nosetests -m $TEST_SCRIPT done 

Voy a dar una respuesta Testoob .

Ejecutar pruebas en un solo archivo es como la nariz:

 testoob test_foo.py 

Para ejecutar pruebas en muchos archivos, puede crear suites con los recolectores de Testoob (en cada subpaquete)

 # src/subpackage?/__init__.py def suite(): import testoob return testoob.collecting.collect_from_files("test_*.py") 

y

 # src/alltests.py test_modules = [ 'subpackage1.suite', 'subpackage2.suite', ] def suite(): import unittest return unittest.TestLoader().loadTestsFromNames(test_modules) if __name__ == "__main__": import testoob testoob.main(defaultTest="suite") 

No he probado su escenario específico.